]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
New upstream version 45~beta.1
authorJeremy Bícha <jeremy.bicha@canonical.com>
Thu, 17 Aug 2023 00:23:12 +0000 (20:23 -0400)
committerJeremy Bícha <jeremy.bicha@canonical.com>
Thu, 17 Aug 2023 00:23:12 +0000 (20:23 -0400)
1  2 
data/theme/gnome-shell-dark.css
data/theme/gnome-shell-high-contrast.css
data/theme/gnome-shell-light.css
subprojects/gvc/.gitlab-ci.yml
subprojects/gvc/gvc-channel-map.c
subprojects/gvc/gvc-mixer-card.c
subprojects/gvc/gvc-mixer-control.c
subprojects/gvc/gvc-mixer-event-role.c
subprojects/gvc/gvc-mixer-stream.c
subprojects/gvc/gvc-mixer-ui-device.c

index 6fb48bea34ac91b8105f69c9b32f2c11b752b803,0000000000000000000000000000000000000000..58b4b98365d0462408e17dd7fe56f7faefbea659
mode 100644,000000..100644
--- /dev/null
@@@ -1,2881 -1,0 +1,2937 @@@
-   background-color: #474747; }
 +/* This stylesheet is generated, DO NOT EDIT */
 +/* Copyright 2009, 2015 Red Hat, Inc.
 + *
 + * Portions adapted from Mx's data/style/default.css
 + *   Copyright 2009 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU Lesser General Public License,
 + * version 2.1, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT ANY
 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 + * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 + */
 +/* Global Values */
 +stage {
 +  font-size: 11pt;
 +  color: white; }
 +
 +/* Common Stylings */
 +.app-well-app.app-folder .overview-icon, .app-folder.grid-search-result .overview-icon, .app-well-app .overview-icon, .grid-search-result .overview-icon, .dash-item-container .show-apps .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box {
 +  border-radius: 16px;
 +  padding: 6px;
 +  spacing: 6px;
 +  border: 2px solid transparent;
 +  transition-duration: 200ms;
 +  text-align: center;
 +  color: inherit; }
 +
 +#LookingGlassDialog .notebook-tab, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, .app-folder-dialog .folder-name-container .edit-folder-button, .button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  border-radius: 8px;
 +  border-style: solid;
 +  border-width: 1px;
 +  font-weight: bold;
 +  padding: 3px 24px; }
 +
 +.app-folder-dialog .folder-name-container .edit-folder-button, .button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:focus, .button:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .pager-button:focus, .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .close-button:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:focus:hover, .button:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .background-app-item .close-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:focus:active, .button:focus:active, .calendar .calendar-day:focus:active, .calendar .calendar-month-header .pager-button:focus:active, .icon-button:focus:active, .login-dialog-button.cancel-button:focus:active, .login-dialog-button.switch-user-button:focus:active, .login-dialog-button.login-dialog-session-list-button:focus:active, .background-app-item .close-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:hover, .button:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .pager-button:hover, .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .close-button:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:insensitive, .button:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .close-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:selected, .button:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .pager-button:selected, .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .background-app-item .close-button:selected, .app-folder-dialog .folder-name-container .edit-folder-button:active, .button:active, .calendar .calendar-day:active, .calendar .calendar-month-header .pager-button:active, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .close-button:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:checked, .button:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .pager-button:checked, .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .background-app-item .close-button:checked {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #5e5e5e; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:checked:hover, .button:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .background-app-item .close-button:checked:hover {
 +      background-color: #666666; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:checked:active, .button:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .background-app-item .close-button:checked:active {
 +      background-color: #6d6d6d; }
 +  .app-folder-dialog .folder-name-container .default.edit-folder-button, .default.button, .calendar .default.calendar-day, .calendar .calendar-day.calendar-today, .calendar .calendar-month-header .default.pager-button, .default.icon-button, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .background-app-item .default.close-button {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:focus, .default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:hover, .default.button:hover, .calendar .default.calendar-day:hover, .calendar .calendar-day.calendar-today:hover, .calendar .calendar-month-header .default.pager-button:hover, .default.icon-button:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .default.close-button:hover, .app-folder-dialog .folder-name-container .default.edit-folder-button:focus, .default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:active, .default.button:active, .calendar .default.calendar-day:active, .calendar .calendar-day.calendar-today:active, .calendar .calendar-month-header .default.pager-button:active, .default.icon-button:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .default.close-button:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:insensitive, .default.button:insensitive, .calendar .default.calendar-day:insensitive, .calendar .calendar-day.calendar-today:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .default.icon-button:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .default.close-button:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .app-folder-dialog .folder-name-container .flat.edit-folder-button, .calendar .app-folder-dialog .folder-name-container .calendar-day.edit-folder-button, .app-folder-dialog .folder-name-container .calendar .calendar-day.edit-folder-button, .flat.button, .calendar .button.calendar-day, .calendar .calendar-day.calendar-today, .calendar .flat.calendar-day, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .flat.icon-button, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .background-app-item .flat.close-button, .calendar .icon-button.calendar-day, .calendar .calendar-day.login-dialog-button.cancel-button, .calendar .calendar-day.login-dialog-button.switch-user-button, .calendar .calendar-day.login-dialog-button.login-dialog-session-list-button, .calendar .background-app-item .calendar-day.close-button, .background-app-item .calendar .calendar-day.close-button {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #474747;
 +    background-color: transparent; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus, .flat.button:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .pager-button:focus, .flat.icon-button:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .flat.close-button:focus {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #454d57;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus:hover, .flat.button:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .flat.icon-button:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .background-app-item .flat.close-button:focus:hover {
 +        background-color: #4c545e;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus:active, .flat.button:focus:active, .calendar .calendar-day:focus:active, .calendar .calendar-month-header .pager-button:focus:active, .flat.icon-button:focus:active, .flat.login-dialog-button.cancel-button:focus:active, .flat.login-dialog-button.switch-user-button:focus:active, .flat.login-dialog-button.login-dialog-session-list-button:focus:active, .background-app-item .flat.close-button:focus:active {
 +        background-color: #535b64;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:hover, .flat.button:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .pager-button:hover, .flat.icon-button:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .flat.close-button:hover {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #4f4f4f; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:insensitive, .flat.button:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .flat.icon-button:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .flat.close-button:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05); }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:selected, .flat.button:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .pager-button:selected, .flat.icon-button:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .background-app-item .flat.close-button:selected, .app-folder-dialog .folder-name-container .flat.edit-folder-button:active, .flat.button:active, .calendar .calendar-day:active, .calendar .calendar-month-header .pager-button:active, .flat.icon-button:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .flat.close-button:active {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #565656; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked, .flat.button:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .pager-button:checked, .flat.icon-button:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .background-app-item .flat.close-button:checked {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #5e5e5e; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked:hover, .flat.button:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .flat.icon-button:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .background-app-item .flat.close-button:checked:hover {
 +        background-color: #666666; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked:active, .flat.button:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .flat.icon-button:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .background-app-item .flat.close-button:checked:active {
 +        background-color: #6d6d6d; }
 +    .app-folder-dialog .folder-name-container .flat.default.edit-folder-button, .flat.default.button, .calendar .default.calendar-day, .calendar .calendar-day.calendar-today, .calendar .calendar-month-header .default.pager-button, .default.icon-button, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .background-app-item .default.close-button {
 +      transition-duration: 100ms;
 +      background-color: #3584e4;
 +      color: #ffffff; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:focus, .flat.default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +        box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:hover, .flat.default.button:hover, .calendar .default.calendar-day:hover, .calendar .calendar-day.calendar-today:hover, .calendar .calendar-month-header .default.pager-button:hover, .default.icon-button:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .default.close-button:hover, .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:focus, .flat.default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +        background-color: #4b92e7;
 +        color: white; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:active, .flat.default.button:active, .calendar .default.calendar-day:active, .calendar .calendar-day.calendar-today:active, .calendar .calendar-month-header .default.pager-button:active, .default.icon-button:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .default.close-button:active {
 +        background-color: #1d72d8;
 +        color: #ededed; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:insensitive, .flat.default.button:insensitive, .calendar .default.calendar-day:insensitive, .calendar .calendar-day.calendar-today:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .default.icon-button:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .default.close-button:insensitive {
 +        transition-duration: 100ms;
 +        color: rgba(255, 255, 255, 0.5);
 +        background-color: rgba(255, 255, 255, 0.05);
 +        background-color: rgba(53, 132, 228, 0.5);
 +        color: rgba(255, 255, 255, 0.5); }
 +
 +.login-dialog-prompt-entry, .search-entry, .lg-dialog StEntry, StEntry {
 +  border-radius: 8px;
 +  padding: 9px 9px;
 +  selection-background-color: #3584e4;
 +  selected-color: #ffffff; }
 +
 +StEntry {
 +  transition-duration: 100ms;
 +  background-color: rgba(255, 255, 255, 0.15);
 +  color: rgba(255, 255, 255, 0.7); }
 +  StEntry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25); }
 +  StEntry:focus {
 +    transition-duration: 100ms;
 +    background-color: rgba(201, 222, 248, 0.2875);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
 +    color: white; }
 +  StEntry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25);
 +    color: rgba(255, 255, 255, 0.5); }
 +  StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +.modal-dialog .modal-dialog-linked-button, .hotplug-notification-item, .notification-banner .notification-button {
 +  padding: 12px;
 +  font-weight: bold !important;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #535353; }
 +  .modal-dialog .modal-dialog-linked-button:ltr, .hotplug-notification-item:ltr, .notification-banner .notification-button:ltr {
 +    margin-right: 1px; }
 +  .modal-dialog .modal-dialog-linked-button:rtl, .hotplug-notification-item:rtl, .notification-banner .notification-button:rtl {
 +    margin-left: 1px; }
 +  .modal-dialog .modal-dialog-linked-button:insensitive, .hotplug-notification-item:insensitive, .notification-banner .notification-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .modal-dialog .modal-dialog-linked-button:focus, .hotplug-notification-item:focus, .notification-banner .notification-button:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #505862;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .modal-dialog .modal-dialog-linked-button:focus:hover, .hotplug-notification-item:focus:hover, .notification-banner .notification-button:focus:hover {
 +      background-color: #575f68;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .modal-dialog .modal-dialog-linked-button:focus:active, .hotplug-notification-item:focus:active, .notification-banner .notification-button:focus:active {
 +      background-color: #5e666f;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .modal-dialog .modal-dialog-linked-button:hover, .hotplug-notification-item:hover, .notification-banner .notification-button:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #5b5b5b; }
 +  .modal-dialog .modal-dialog-linked-button:active, .hotplug-notification-item:active, .notification-banner .notification-button:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #626262; }
 +  .modal-dialog .modal-dialog-linked-button:checked, .hotplug-notification-item:checked, .notification-banner .notification-button:checked {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #6a6a6a; }
 +    .modal-dialog .modal-dialog-linked-button:checked:hover, .hotplug-notification-item:checked:hover, .notification-banner .notification-button:checked:hover {
 +      background-color: #727272; }
 +    .modal-dialog .modal-dialog-linked-button:checked:active, .hotplug-notification-item:checked:active, .notification-banner .notification-button:checked:active {
 +      background-color: #797979; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:ltr, .hotplug-notification-item:first-child:ltr, .notification-banner .notification-button:first-child:ltr {
 +    border-radius: 0 0 0 16px; }
 +  .modal-dialog .modal-dialog-linked-button:last-child:ltr, .hotplug-notification-item:last-child:ltr, .notification-banner .notification-button:last-child:ltr {
 +    border-radius: 0 0 16px;
 +    margin-right: 0 !important; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:rtl, .hotplug-notification-item:first-child:rtl, .notification-banner .notification-button:first-child:rtl {
 +    border-radius: 0 0 16px; }
 +  .modal-dialog .modal-dialog-linked-button:last-child:rtl, .hotplug-notification-item:last-child:rtl, .notification-banner .notification-button:last-child:rtl {
 +    border-radius: 0 0 0 16px;
 +    margin-left: 0 !important; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:last-child, .hotplug-notification-item:first-child:last-child, .notification-banner .notification-button:first-child:last-child {
 +    border-radius: 0 0 16px 16px;
 +    margin-left: 0 !important;
 +    margin-right: 0 !important; }
 +
 +.dash-label, .window-caption, .screenshot-ui-tooltip {
 +  background-color: rgba(0, 0, 0, 0.9);
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 99px;
 +  padding: 6px 12px;
 +  text-align: center; }
 +
 +/* General Typography */
 +.user-widget.vertical .user-widget-label, .unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
 +  font-weight: 800;
 +  font-size: 20pt; }
 +
 +.lg-debug-flags-header, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
 +  font-weight: 800;
 +  font-size: 15pt; }
 +
 +.user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
 +  font-weight: 700;
 +  font-size: 15pt; }
 +
 +.bt-menu-placeholder.popup-menu-item, .message-dialog-content .message-dialog-title.lightweight, .headline {
 +  font-weight: 700;
 +  font-size: 13pt; }
 +
 +.lg-extension-name, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-forecast-temp, .weather-button .weather-header, .world-clocks-button .world-clocks-time, .world-clocks-button .world-clocks-header, .events-button .events-title, .calendar .calendar-month-header .calendar-month-label, .datemenu-today-button .day-label {
 +  font-weight: 700;
 +  font-size: 11pt; }
 +
 +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
 +  font-weight: 700;
 +  font-size: 9pt; }
 +
 +.lg-completions-text, .caps-lock-warning-label, #dash, .background-app-item .subtitle, .icon-label-button-container, .prompt-dialog-error-label,
 +.prompt-dialog-info-label,
 +.prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .weather-button .weather-forecast-time, .world-clocks-button .world-clocks-timezone, .events-button .event-time {
 +  font-weight: 400;
 +  font-size: 9pt; }
 +
 +.calendar .calendar-day {
 +  font-weight: 400;
 +  font-size: 8pt; }
 +
 +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-forecast-time, .world-clocks-button .world-clocks-timezone, .world-clocks-button .world-clocks-time, .events-button .event-time, .calendar .calendar-day {
 +  font-feature-settings: "tnum"; }
 +
 +/* OSD Elements */
 +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-monitor-label, .osd-window {
 +  color: #ffffff;
 +  background-color: #353535;
 +  border: 1px solid rgba(255, 255, 255, 0.02);
 +  border-radius: 999px;
 +  padding: 12px; }
 +
 +.lg-dialog StEntry {
 +  transition-duration: 100ms;
 +  background-color: rgba(255, 255, 255, 0.15);
 +  color: rgba(255, 255, 255, 0.7); }
 +  .lg-dialog StEntry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25); }
 +  .lg-dialog StEntry:focus {
 +    transition-duration: 100ms;
 +    background-color: rgba(201, 222, 248, 0.2875);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
 +    color: #ffffff; }
 +  .lg-dialog StEntry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25);
 +    color: rgba(255, 255, 255, 0.5); }
 +  .lg-dialog StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +#LookingGlassDialog .notebook-tab, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  transition-duration: 100ms;
 +  color: #ffffff;
-     background-color: #454d57;
++  background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  #LookingGlassDialog .notebook-tab:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-       background-color: #4c545e;
++    background-color: rgba(118, 172, 237, 0.19);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    #LookingGlassDialog .notebook-tab:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
-       background-color: #535b64;
++      background-color: rgba(118, 172, 237, 0.19);
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    #LookingGlassDialog .notebook-tab:focus:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:active, .screenshot-ui-show-pointer-button:focus:active, .screenshot-ui-type-button:focus:active {
-     background-color: #4f4f4f; }
++      background-color: rgba(118, 172, 237, 0.19);
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  #LookingGlassDialog .notebook-tab:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-     background-color: #565656; }
++    background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-     background-color: #5e5e5e; }
++    background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:outlined, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined, .screenshot-ui-show-pointer-button:outlined, .screenshot-ui-type-button:outlined, #LookingGlassDialog .notebook-tab:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-       background-color: #666666; }
++    background-color: rgba(255, 255, 255, 0.1); }
 +    #LookingGlassDialog .notebook-tab:outlined:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined:hover, .screenshot-ui-show-pointer-button:outlined:hover, .screenshot-ui-type-button:outlined:hover, #LookingGlassDialog .notebook-tab:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
-       background-color: #6d6d6d; }
++      background-color: rgba(255, 255, 255, 0.1); }
 +    #LookingGlassDialog .notebook-tab:outlined:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined:active, .screenshot-ui-show-pointer-button:outlined:active, .screenshot-ui-type-button:outlined:active, #LookingGlassDialog .notebook-tab:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++      background-color: rgba(255, 255, 255, 0.1); }
 +
 +.screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none; }
 +  .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
-       transition-duration: 100ms;
-       color: rgba(255, 255, 255, 0.5);
-       background-color: rgba(255, 255, 255, 0.05);
-       background-color: transparent;
-       color: rgba(255, 255, 255, 0.5); }
++    background-color: transparent; }
 +  .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    transition-duration: 100ms;
 +    background-color: transparent;
 +    background-color: none;
 +    box-shadow: none; }
 +    .screenshot-ui-show-pointer-button:insensitive:insensitive, .screenshot-ui-type-button:insensitive:insensitive {
-     background-color: rgba(194, 215, 240, 0.2875);
-     box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
++      background-color: transparent; }
 +
 +/* System Elements */
 +.login-dialog-prompt-entry, .search-entry {
 +  transition-duration: 100ms;
 +  background-color: rgba(246, 245, 244, 0.15);
 +  color: rgba(246, 245, 244, 0.7); }
 +  .login-dialog-prompt-entry:hover, .search-entry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(246, 245, 244, 0.25); }
 +  .login-dialog-prompt-entry:focus, .search-entry:focus {
 +    transition-duration: 100ms;
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++    background-color: rgba(246, 245, 244, 0.2625);
++    box-shadow: inset 0 0 0 2px rgba(246, 245, 244, 0.2);
 +    color: #f6f5f4; }
 +  .login-dialog-prompt-entry:insensitive, .search-entry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(246, 245, 244, 0.25);
 +    color: rgba(246, 245, 244, 0.5); }
 +  .login-dialog-prompt-entry StLabel.hint-text, .search-entry StLabel.hint-text {
 +    color: rgba(246, 245, 244, 0.7); }
 +
 +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
 +  transition-duration: 100ms;
 +  color: #f6f5f4;
 +  background-color: #464646; }
 +  .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(246, 245, 244, 0.5);
 +    background-color: rgba(246, 245, 244, 0.05); }
 +  .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #444c56;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
 +      background-color: #4b535d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .login-dialog-button.cancel-button:focus:active, .login-dialog-button.switch-user-button:focus:active, .login-dialog-button.login-dialog-session-list-button:focus:active {
 +      background-color: #525a64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #4e4e4e; }
 +  .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #555555; }
 +  .login-dialog-button.cancel-button:outlined, .login-dialog-button.switch-user-button:outlined, .login-dialog-button.login-dialog-session-list-button:outlined, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #5d5d5d; }
 +    .login-dialog-button.cancel-button:outlined:hover, .login-dialog-button.switch-user-button:outlined:hover, .login-dialog-button.login-dialog-session-list-button:outlined:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
 +      background-color: #656565; }
 +    .login-dialog-button.cancel-button:outlined:active, .login-dialog-button.switch-user-button:outlined:active, .login-dialog-button.login-dialog-session-list-button:outlined:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
 +      background-color: #6c6c6c; }
 +
 +/* WIDGETS */
 +.shell-link {
 +  color: #8fbbf0; }
 +  .shell-link:hover {
 +    color: #bcd6f6; }
 +
 +.lowres-icon {
 +  icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); }
 +
 +.icon-dropshadow {
 +  icon-shadow: 0 1px 5px rgba(0, 0, 0, 0.8); }
 +
 +/* Entries */
 +StEntry StIcon.capslock-warning {
 +  icon-size: 1.09em;
 +  warning-color: #f6d32d;
 +  padding: 0 4px; }
 +
 +StEntry StIcon.peek-password {
 +  icon-size: 1.09em;
 +  padding: 0 4px; }
 +
 +StEntry StLabel.hint-text {
 +  margin-left: 2px; }
 +
 +/* Buttons */
 +.button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  min-height: 22px; }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  border-radius: 99px;
 +  padding: 12px;
 +  min-height: 16px; }
 +  .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .background-app-item .close-button StIcon {
 +    icon-size: 1.09em;
 +    -st-icon-style: symbolic; }
 +
 +/* Check Boxes */
 +.check-box StBoxLayout {
 +  spacing: .8em; }
 +
 +.check-box StBin {
 +  width: 24px;
 +  height: 24px;
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
 +
 +.check-box:focus StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
 +
 +.check-box:checked StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
 +
 +.check-box:focus:checked StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
 +
 +/* Switches */
 +.toggle-switch {
 +  color: white;
 +  height: 26px;
 +  width: 48px;
 +  background-size: contain;
 +  background-image: url("resource:///org/gnome/shell/theme/toggle-off.svg"); }
 +  .toggle-switch:checked {
 +    background-image: url("resource:///org/gnome/shell/theme/toggle-on.svg"); }
 +
 +/* Slider */
 +.slider {
 +  -barlevel-height: 4px;
 +  -barlevel-background-color: rgba(255, 255, 255, 0.2);
 +  -barlevel-border-width: 2px;
 +  -barlevel-border-color: transparent;
 +  -barlevel-active-background-color: #3584e4;
 +  -barlevel-active-border-color: transparent;
 +  -barlevel-overdrive-color: #e01b24;
 +  -barlevel-overdrive-border-color: transparent;
 +  -barlevel-overdrive-separator-width: 1px;
 +  -slider-handle-radius: 8px;
 +  -slider-handle-border-width: 0;
 +  -slider-handle-border-color: transparent; }
 +
 +/* Scrollbars */
 +StScrollView.vfade {
 +  -st-vfade-offset: 68px; }
 +
 +StScrollView.hfade {
 +  -st-hfade-offset: 68px; }
 +
 +StScrollBar {
 +  padding: 0; }
 +  StScrollView StScrollBar {
 +    min-width: 8px;
 +    min-height: 8px; }
 +  StScrollBar StBin#trough {
 +    border-radius: 0;
 +    background-color: transparent; }
 +  StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
 +    border-radius: 8px;
 +    background-color: #717171;
 +    border: 3px solid transparent;
 +    transition: 500ms all ease; }
 +    StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
 +      background-color: #9a9a9a; }
 +    StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
 +      background-color: #868686; }
 +
 +/* Popovers/Menus */
 +.popup-menu-boxpointer, .candidate-popup-boxpointer {
 +  -arrow-rise: 6px; }
 +
 +.popup-menu {
 +  min-width: 15em;
 +  color: white; }
 +  .popup-menu.panel-menu {
 +    margin-bottom: 1.75em; }
 +
 +.popup-menu-content, .candidate-popup-content {
 +  padding: 6px;
 +  background-color: #353535;
 +  border-radius: 20px;
 +  border: 1px solid #424242;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
 +
 +.popup-menu-item {
 +  font-weight: normal;
 +  spacing: 6px;
 +  transition-duration: 100ms;
 +  padding: 9px 12px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  border-radius: 12px; }
 +  .popup-menu-item:insensitive {
-   .popup-sub-menu .popup-menu-ornament {
-     icon-size: 1.09em !important;
-     width: 1.09em; }
++    background-color: transparent; }
 +  .popup-menu-item:focus, .popup-menu-item:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #5b5b5b; }
 +  .popup-menu-item:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #626262; }
 +  .popup-menu-item:checked {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #6a6a6a; }
 +    .popup-menu-item:checked:hover {
 +      background-color: #727272; }
 +    .popup-menu-item:checked:active {
 +      background-color: #797979; }
 +  .popup-menu-item:checked {
 +    border-radius: 12px 12px 0 0 !important; }
 +  .popup-menu-item .toggle-switch:ltr {
 +    margin-left: 4px; }
 +  .popup-menu-item .toggle-switch:rtl {
 +    margin-right: 4px; }
 +
++.popup-ornamented-menu-item:ltr {
++  padding-left: 6px; }
++
++.popup-ornamented-menu-item:rtl {
++  padding-right: 6px; }
++
 +.popup-inactive-menu-item {
 +  color: white; }
 +  .popup-inactive-menu-item:insensitive {
 +    color: #9a9a9a; }
 +
 +.popup-menu-arrow,
 +.popup-menu-icon {
 +  icon-size: 16px !important; }
 +
 +.popup-sub-menu {
 +  border-radius: 0 0 13px 13px;
 +  margin-bottom: 6px; }
-   .popup-separator-menu-item .popup-menu-ornament {
-     width: 0 !important; }
 +  .popup-sub-menu .popup-menu-item {
 +    border-radius: 0;
 +    font-weight: normal;
 +    spacing: 6px;
 +    transition-duration: 100ms;
 +    padding: 9px 12px;
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #636363;
 +    border-top-width: 0; }
 +    .popup-sub-menu .popup-menu-item:focus, .popup-sub-menu .popup-menu-item:hover {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #6b6b6b; }
 +    .popup-sub-menu .popup-menu-item:active {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #727272; }
 +    .popup-sub-menu .popup-menu-item:checked {
 +      transition-duration: 100ms;
 +      color: white;
 +      background-color: #7a7a7a; }
 +      .popup-sub-menu .popup-menu-item:checked:hover {
 +        background-color: #828282; }
 +      .popup-sub-menu .popup-menu-item:checked:active {
 +        background-color: #898989; }
 +    .popup-sub-menu .popup-menu-item:last-child {
 +      border-radius: 0 0 12px 12px;
 +      border-bottom-width: 0; }
 +  .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
 +    border-radius: 0; }
 +  .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
 +    border-radius: 0 0 12px 12px; }
 +
 +.popup-menu-ornament {
 +  icon-size: 1.09em !important;
 +  width: 1.09em; }
 +
 +.popup-separator-menu-item {
 +  border: none !important; }
 +  .popup-separator-menu-item .popup-separator-menu-item-separator {
 +    height: 1px;
 +    background-color: rgba(255, 255, 255, 0.1); }
-   .app-menu .popup-menu-ornament {
-     width: 0 !important; }
 +  .popup-sub-menu .popup-separator-menu-item {
 +    background-color: transparent; }
 +    .popup-sub-menu .popup-separator-menu-item:ltr {
 +      margin-right: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item:rtl {
 +      margin-left: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
 +      background-color: rgba(255, 255, 255, 0.1); }
 +
 +.background-menu {
 +  -boxpointer-gap: 0px;
 +  -arrow-rise: 0px; }
 +
 +.app-menu {
 +  max-width: 27.25em; }
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
 +    margin-right: 8px; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
 +    margin-left: 8px; }
 +
 +/* Date/Time Menu */
 +#calendarArea {
 +  padding: 4px; }
 +
 +.datemenu-calendar-column {
 +  spacing: 6px; }
 +  .datemenu-calendar-column:ltr {
 +    padding-left: 6px; }
 +  .datemenu-calendar-column:rtl {
 +    padding-right: 6px; }
 +  .datemenu-calendar-column .datemenu-displays-box {
 +    spacing: 6px; }
 +
 +/* today button (the date) */
 +.datemenu-today-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  padding: 9px; }
 +  .datemenu-today-button:insensitive {
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++    background-color: transparent; }
 +  .datemenu-today-button:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .datemenu-today-button:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .datemenu-today-button:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .datemenu-today-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .datemenu-today-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .datemenu-today-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05);
 +    background-color: transparent; }
 +
 +/* Calendar */
 +.calendar {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  margin-top: 0; }
 +  .calendar:insensitive {
-   border-radius: 12px;
++    background-color: transparent; }
 +  .calendar:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .calendar:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .calendar:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .calendar:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .calendar:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .calendar:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05);
 +    background-color: transparent; }
 +  .calendar .calendar-month-header .calendar-change-month-back StIcon,
 +  .calendar .calendar-month-header .calendar-change-month-forward StIcon {
 +    icon-size: 1.09em; }
 +  .calendar .calendar-month-header .calendar-month-label {
 +    padding: 8px 0; }
 +  .calendar .calendar-month-header .pager-button {
 +    padding: 0 !important;
 +    height: 32px;
 +    width: 32px;
 +    margin: 2px;
 +    border-radius: 8px;
 +    transition-duration: 100ms; }
 +  .calendar .calendar-day {
 +    border-radius: 99px;
 +    height: 3em !important;
 +    width: 3em !important;
 +    margin: 2px;
 +    padding: 0 !important;
 +    font-weight: 600;
 +    text-align: center;
 +    transition-duration: 100ms; }
 +    .calendar .calendar-day.calendar-day-heading {
 +      background-color: transparent;
 +      color: #9a9a9a;
 +      height: 0.93em !important;
 +      padding-top: 6px !important;
 +      margin-bottom: 0;
 +      border-radius: 9px; }
 +    .calendar .calendar-day.calendar-weekend {
 +      color: #9a9a9a; }
 +    .calendar .calendar-day.calendar-other-month {
 +      color: rgba(154, 154, 154, 0.3) !important;
 +      font-weight: normal; }
 +    .calendar .calendar-day.calendar-day-with-events {
 +      background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
 +      background-size: contain; }
 +  .calendar .calendar-week-number {
 +    font-size: 7pt;
 +    font-weight: bold;
 +    font-feature-settings: "tnum";
 +    text-align: center;
 +    margin: 6px;
 +    padding: 0 6px;
 +    border-radius: 3px;
 +    background-color: rgba(255, 255, 255, 0.1);
 +    color: #9a9a9a; }
 +
 +/* Events */
 +.events-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747;
 +  padding: 12px; }
 +  .events-button:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .events-button:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .events-button:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .events-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .events-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .events-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .events-button .events-box {
 +    spacing: 6px; }
 +  .events-button .events-list {
 +    spacing: 12px;
 +    color: white; }
 +  .events-button .events-title {
 +    margin-bottom: 4px; }
 +  .events-button .event-time {
 +    color: #9a9a9a; }
 +
 +/* World clocks */
 +.world-clocks-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747;
 +  padding: 12px; }
 +  .world-clocks-button:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .world-clocks-button:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .world-clocks-button:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .world-clocks-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .world-clocks-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .world-clocks-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .world-clocks-button .world-clocks-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +  .world-clocks-button .world-clocks-header {
 +    color: #9a9a9a; }
 +  .world-clocks-button .world-clocks-city {
 +    color: white; }
 +  .world-clocks-button .world-clocks-time {
 +    color: white; }
 +    .world-clocks-button .world-clocks-time:ltr {
 +      text-align: right; }
 +    .world-clocks-button .world-clocks-time:rtl {
 +      text-align: left; }
 +  .world-clocks-button .world-clocks-timezone {
 +    color: #9a9a9a; }
 +
 +/* Weather */
 +.weather-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747;
 +  padding: 12px; }
 +  .weather-button:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .weather-button:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .weather-button:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .weather-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .weather-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .weather-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .weather-button .weather-box {
 +    spacing: 10px; }
 +  .weather-button .weather-header-box {
 +    spacing: 6px; }
 +  .weather-button .weather-header {
 +    color: #9a9a9a; }
 +    .weather-button .weather-header.location {
 +      font-weight: normal; }
 +  .weather-button .weather-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +  .weather-button .weather-forecast-time {
 +    color: #b3b3b3;
 +    padding-top: 0.2em;
 +    padding-bottom: 0.4em; }
 +  .weather-button .weather-forecast-icon {
 +    icon-size: 2.18em; }
 +
 +/* Message List */
 +.message-list {
 +  width: 29em;
 +  border: solid rgba(255, 255, 255, 0.1); }
 +  .message-list:ltr {
 +    margin-left: 0;
 +    margin-right: 4px;
 +    padding-right: 6px;
 +    border-right-width: 1px; }
 +  .message-list:rtl {
 +    margin-right: 0;
 +    margin-left: 4px;
 +    padding-left: 6px;
 +    border-left-width: 1px; }
 +  .message-list .message-list-placeholder {
 +    color: #9a9a9a; }
 +    .message-list .message-list-placeholder > StIcon {
 +      icon-size: 3.27em;
 +      margin-bottom: 12px;
 +      -st-icon-style: symbolic; }
 +
 +.message-list-sections {
 +  spacing: 6px;
 +  margin: 0;
 +  padding-bottom: 6px; }
 +  .message-list-sections:ltr {
 +    margin-right: 12px; }
 +  .message-list-sections:rtl {
 +    margin-left: 12px; }
 +
 +.message-list-section,
 +.message-list-section-list {
 +  spacing: 6px; }
 +
 +.message-list-controls {
 +  padding: 6px;
 +  spacing: 6px; }
 +  .message-list-controls .dnd-button {
 +    border-width: 2px;
 +    border-color: transparent;
 +    border-radius: 32px;
 +    border-style: solid; }
 +    .message-list-controls .dnd-button:focus {
 +      border-color: rgba(53, 132, 228, 0.6); }
 +
 +.message {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747; }
 +  .message:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .message:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .message:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .message:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .message:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .message:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .message .message-icon-bin {
 +    padding: 18px; }
 +    .message .message-icon-bin:ltr {
 +      padding-right: 6px; }
 +    .message .message-icon-bin:rtl {
 +      padding-left: 6px; }
 +    .message .message-icon-bin > StIcon {
 +      icon-size: 2.18em;
 +      -st-icon-style: symbolic; }
 +    .message .message-icon-bin > .fallback-app-icon {
 +      width: 1.09em;
 +      height: 1.09em; }
 +  .message .message-content {
 +    spacing: 4px;
 +    padding: 9px;
 +    margin-bottom: 8px; }
 +  .message .message-title {
 +    font-weight: bold;
 +    /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
 +    padding-top: 0.57em; }
 +  .message .message-secondary-bin {
 +    padding: 0 8px; }
 +    .message .message-secondary-bin > .event-time {
 +      color: rgba(255, 255, 255, 0.5);
 +      font-size: 9pt;
 +      /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
 +      padding-bottom: 0.13em; }
 +      .message .message-secondary-bin > .event-time:ltr {
 +        text-align: right; }
 +      .message .message-secondary-bin > .event-time:rtl {
 +        text-align: left; }
 +  .message .message-close-button {
 +    color: white;
 +    background-color: rgba(255, 255, 255, 0.2);
 +    border-radius: 99px;
 +    padding: 5px;
 +    margin: 1px; }
 +    .message .message-close-button:hover {
 +      background-color: rgba(255, 255, 255, 0.3); }
 +    .message .message-close-button:active {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +    .message .message-close-button > StIcon {
 +      icon-size: 1.09em; }
 +  .message .message-body {
 +    color: #e6e6e6; }
 +
 +.url-highlighter {
 +  link-color: #8fbbf0; }
 +
 +/* Media Controls */
 +.message-media-control {
 +  padding: 0 18px;
 +  margin: 12px 0;
 +  border-radius: 8px;
 +  color: white; }
 +  .message-media-control:hover {
 +    background-color: #5b5b5b;
 +    color: white; }
 +  .message-media-control:active {
 +    background-color: #606060;
 +    color: white; }
 +  .message-media-control:insensitive {
 +    color: #a7a7a7; }
 +  .message-media-control:last-child:ltr {
 +    margin-right: 12px; }
 +  .message-media-control:last-child:rtl {
 +    margin-left: 12px; }
 +  .message-media-control StIcon {
 +    icon-size: 1.09em; }
 +
 +.media-message-cover-icon {
 +  icon-size: 3.27em !important;
 +  border-radius: 8px; }
 +  .media-message-cover-icon.fallback {
 +    color: #d4d4d4;
 +    background-color: #353535;
 +    border: 1px solid transparent;
 +    border-radius: 8px;
 +    icon-size: 2.18em !important;
 +    padding: 14px; }
 +
 +.candidate-popup-content {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +.candidate-index {
 +  padding: 0;
 +  padding-right: 6px;
 +  color: #9a9a9a; }
 +
 +.candidate-box {
 +  padding: 6px 12px 6px 12px;
 +  border-radius: 8px; }
 +  .candidate-box:selected {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +  .candidate-box:hover {
 +    background-color: #4e4e4e;
 +    color: white; }
 +
 +.candidate-page-button-box {
 +  height: 2em; }
 +  .vertical .candidate-page-button-box {
 +    padding-top: 12px; }
 +  .horizontal .candidate-page-button-box {
 +    padding-left: 12px; }
 +
 +.candidate-page-button {
 +  padding: 6px; }
 +  .candidate-page-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.candidate-page-button-previous {
 +  border-radius: 8px 0px 0px 8px;
 +  border-right-width: 0;
 +  box-shadow: none; }
 +
 +.candidate-page-button-next {
 +  border-radius: 0px 8px 8px 0px;
 +  box-shadow: none; }
 +
 +/* Notifications & Message Tray */
 +.notification-banner {
 +  min-height: 64px;
 +  width: 34em;
 +  box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.2);
-   background-color: #424242;
++  border-radius: 16px;
 +  margin: 4px; }
 +  .notification-banner .notification-actions {
 +    spacing: 0; }
 +
 +.summary-source-counter {
 +  font-size: 10pt;
 +  font-weight: bold;
 +  height: 1.6em;
 +  width: 1.6em;
 +  -shell-counter-overlap-x: 3px;
 +  -shell-counter-overlap-y: 3px;
 +  background-color: #3584e4;
 +  color: #ffffff;
 +  border: 2px solid white;
 +  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
 +  border-radius: 0.9em; }
 +
 +.chat-body {
 +  spacing: 5px; }
 +
 +.chat-response {
 +  margin: 5px; }
 +
 +.chat-log-message {
 +  color: #e6e6e6; }
 +
 +.chat-new-group {
 +  padding-top: 1em; }
 +
 +.chat-received {
 +  padding-left: 4px; }
 +  .chat-received:rtl {
 +    padding-left: 0px;
 +    padding-right: 4px; }
 +
 +.chat-sent {
 +  padding-left: 18pt;
 +  color: white; }
 +  .chat-sent:rtl {
 +    padding-left: 0;
 +    padding-right: 18pt; }
 +
 +.chat-meta-message {
 +  padding-left: 4px;
 +  font-size: 9pt;
 +  font-weight: bold;
 +  color: white; }
 +  .chat-meta-message:rtl {
 +    padding-left: 0;
 +    padding-right: 4px; }
 +
 +.hotplug-notification-item-icon {
 +  icon-size: 24px;
 +  padding: 0 4px; }
 +
 +/* Modal Dialogs */
 +.modal-dialog {
 +  background-color: #353535;
 +  border-radius: 16px;
 +  box-shadow: inset 0 0 0 1px #424242; }
 +  .modal-dialog .modal-dialog-content-box {
 +    margin: 32px 40px;
 +    spacing: 32px;
 +    max-width: 28em; }
 +
 +/* End Session Dialog */
 +.end-session-dialog {
 +  width: 30em; }
 +  .end-session-dialog .end-session-dialog-battery-warning,
 +  .end-session-dialog .dialog-list-title {
 +    color: #f6d32d; }
 +
 +/* Message Dialog */
 +.message-dialog-content {
 +  spacing: 18px; }
 +  .message-dialog-content .message-dialog-title {
 +    text-align: center; }
 +  .message-dialog-content .message-dialog-description {
 +    text-align: center; }
 +
 +/* Dialog List */
 +.dialog-list {
 +  spacing: 18px; }
 +  .dialog-list .dialog-list-title {
 +    text-align: center; }
 +  .dialog-list .dialog-list-scrollview {
 +    max-height: 200px; }
 +  .dialog-list .dialog-list-box {
 +    spacing: 1em; }
 +    .dialog-list .dialog-list-box .dialog-list-item {
 +      spacing: 1em; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
 +        font-weight: bold; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
 +        color: #f2f2f2; }
 +
 +/* Run Dialog */
 +.run-dialog .modal-dialog-content-box {
 +  margin-top: 24px;
 +  margin-bottom: 14px; }
 +
 +.run-dialog .run-dialog-entry {
 +  width: 20em; }
 +
 +.run-dialog .run-dialog-description {
 +  text-align: center;
 +  color: #cccccc; }
 +
 +/* Password or Authentication Dialog */
 +.prompt-dialog {
 +  width: 28em; }
 +  .prompt-dialog .modal-dialog-content-box {
 +    margin-bottom: 24px; }
 +
 +.prompt-dialog-password-grid {
 +  spacing-rows: 8px;
 +  spacing-columns: 4px; }
 +  .prompt-dialog-password-grid .prompt-dialog-password-entry {
 +    width: auto; }
 +    .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
 +      margin-left: 20px; }
 +    .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
 +      margin-right: 20px; }
 +
 +.prompt-dialog-password-layout {
 +  spacing: 8px; }
 +
 +.prompt-dialog-password-entry {
 +  width: 20em; }
 +
 +.prompt-dialog-error-label,
 +.prompt-dialog-info-label,
 +.prompt-dialog-null-label {
 +  text-align: center; }
 +
 +.prompt-dialog-error-label {
 +  color: #f6d32d; }
 +
 +/* Polkit Dialog */
 +.polkit-dialog-user-layout {
 +  text-align: center;
 +  spacing: 8px;
 +  margin-bottom: 6px; }
 +  .polkit-dialog-user-layout .polkit-dialog-user-root-label {
 +    color: #f6d32d; }
 +
 +/* Audio selection dialog */
 +.audio-device-selection-dialog .modal-dialog-content-box {
 +  margin-bottom: 28px; }
 +
 +.audio-device-selection-dialog .audio-selection-box {
 +  spacing: 20px; }
 +
 +.audio-selection-device {
 +  border-radius: 16px; }
 +  .audio-selection-device:hover, .audio-selection-device:focus {
 +    background-color: #4e4e4e; }
 +  .audio-selection-device:active {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +
 +.audio-selection-device-box {
 +  padding: 20px;
 +  spacing: 20px; }
 +
 +.audio-selection-device-icon {
 +  icon-size: 4.36em; }
 +
 +/* Welcome dialog */
 +.welcome-dialog-image {
 +  background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
 +  background-size: contain;
 +  /* Reasonable maximum dimensions */
 +  height: 300px;
 +  width: 300px; }
 +
 +/* Access portal dialog */
 +.access-dialog {
 +  text-align: center; }
 +
 +/* OSD */
 +.osd-window {
 +  text-align: center;
 +  font-weight: bold;
 +  spacing: 12px;
 +  padding: 12px 18px;
 +  margin-bottom: 4em; }
 +  .osd-window > * {
 +    spacing: 8px; }
 +  .osd-window StIcon {
 +    icon-size: 2.18em; }
 +  .osd-window StLabel:ltr {
 +    margin-right: 6px; }
 +  .osd-window StLabel:rtl {
 +    margin-left: 6px; }
 +  .osd-window .level {
 +    margin-bottom: 4px;
 +    height: 6px;
 +    min-width: 10.9em;
 +    -barlevel-height: 6px;
 +    -barlevel-background-color: rgba(255, 255, 255, 0.1);
 +    -barlevel-active-background-color: #ffffff;
 +    -barlevel-overdrive-color: #e01b24;
 +    -barlevel-overdrive-separator-width: 3px; }
 +    .osd-window .level:first-child {
 +      margin-bottom: 0px; }
 +    .osd-window .level:ltr {
 +      margin-right: 6px; }
 +    .osd-window .level:rtl {
 +      margin-left: 6px; }
 +
 +.osd-monitor-label {
 +  border-radius: 16px;
 +  font-size: 3em;
 +  font-weight: bold;
 +  margin: 12px;
 +  text-align: center;
 +  min-width: 1.3em; }
 +
 +/* Pad OSD */
 +.pad-osd-window {
 +  padding: 32px;
 +  background-color: rgba(0, 0, 0, 0.8); }
 +  .pad-osd-window .pad-osd-title-box {
 +    spacing: 12px; }
 +  .pad-osd-window .pad-osd-title-menu-box {
 +    spacing: 6px; }
 +
 +.combo-box-label {
 +  width: 15em; }
 +
 +/* App Switcher */
 +.switcher-popup {
 +  padding: 0;
 +  spacing: 24px; }
 +
 +.switcher-list {
 +  padding: 12px;
 +  border-radius: 28px;
 +  box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.2); }
 +  .switcher-list .switcher-list-item-container {
 +    spacing: 12px; }
 +  .switcher-list .item-box {
 +    background-color: transparent; }
 +    .switcher-list .item-box:hover {
 +      background-color: rgba(255, 255, 255, 0.1); }
 +    .switcher-list .item-box:selected, .switcher-list .item-box:focus {
 +      background-color: rgba(255, 255, 255, 0.13); }
 +      .switcher-list .item-box:selected:hover, .switcher-list .item-box:focus:hover {
 +        background-color: rgba(255, 255, 255, 0.16); }
 +      .switcher-list .item-box:selected:active, .switcher-list .item-box:focus:active {
 +        background-color: rgba(255, 255, 255, 0.13); }
 +    .switcher-list .item-box:active {
 +      background-color: rgba(255, 255, 255, 0.16); }
 +    .switcher-list .item-box:outlined, .switcher-list .item-box:checked {
 +      background-color: rgba(255, 255, 255, 0.19); }
 +      .switcher-list .item-box:outlined:active, .switcher-list .item-box:checked:active {
 +        background-color: rgba(255, 255, 255, 0.22); }
 +      .switcher-list .item-box:outlined:hover, .switcher-list .item-box:checked:hover {
 +        background-color: rgba(255, 255, 255, 0.25); }
 +    .switcher-list .item-box:drop {
 +      border: 2px solid rgba(53, 132, 228, 0.8);
 +      background-color: rgba(53, 132, 228, 0.2); }
 +    .switcher-list .item-box:hover {
 +      background: none; }
 +  .switcher-list .separator {
 +    width: 1px;
 +    background: rgba(255, 255, 255, 0.1); }
 +  .switcher-list .thumbnail-box {
 +    padding: 2px;
 +    spacing: 6px; }
 +  .switcher-list .thumbnail {
 +    width: 256px;
 +    border-radius: 8px; }
 +
 +.switcher-arrow {
 +  border-color: rgba(255, 255, 255, 0.8);
 +  color: rgba(255, 255, 255, 0.8); }
 +  .switcher-arrow:highlighted {
 +    border-color: #ffffff;
 +    color: #ffffff; }
 +
 +.input-source-switcher-symbol {
 +  font-size: 34pt;
 +  width: 96px;
 +  height: 96px; }
 +
 +.cycler-highlight {
 +  border: 5px solid #3584e4; }
 +
 +/* Workspace Switcher */
 +.workspace-switcher {
 +  margin-bottom: 4em;
 +  spacing: 12px;
 +  padding: 12px 18px; }
 +
 +.ws-switcher-indicator {
 +  background-color: rgba(255, 255, 255, 0.5);
 +  padding: 0.1816666667em;
 +  margin: 0.9083333333em;
 +  border-radius: 2.18em; }
 +  .ws-switcher-indicator:active {
 +    background-color: #ffffff;
 +    padding: 0.3633333333em;
 +    margin: 0.7266666667em; }
 +
 +.icon-label-button-container {
 +  spacing: 6px; }
 +  .icon-label-button-container StIcon {
 +    icon-size: 32px; }
 +
 +.screenshot-ui-panel {
 +  border-radius: 37px;
 +  padding: 18px;
 +  padding-bottom: 12px;
 +  margin-bottom: 4em;
 +  spacing: 12px; }
 +
 +.screenshot-ui-close-button {
 +  padding: 6px !important;
 +  margin-top: 12px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
 +  .screenshot-ui-close-button.left {
 +    margin-left: 12px; }
 +  .screenshot-ui-close-button.right {
 +    margin-right: 12px; }
 +
 +.screenshot-ui-type-button {
 +  min-width: 48px;
 +  padding: 12px 18px !important;
 +  border-radius: 19px; }
 +
 +.screenshot-ui-capture-button {
 +  width: 36px;
 +  height: 36px;
 +  border-radius: 99px;
 +  border: 4px #ffffff;
 +  padding: 4px; }
 +  .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
 +    background-color: #ffffff;
 +    transition-duration: 200ms;
 +    border-radius: 99px; }
 +    .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
 +      background-color: #4e4e4e; }
 +  .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d9d9d9; }
 +  .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
 +    background-color: gray; }
 +  .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
 +    background-color: #e01b24; }
 +  .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
 +    background-color: #e62f37; }
 +  .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
 +    background-color: #c0171f; }
 +
 +.screenshot-ui-shot-cast-container {
-     background-color: #4e4e4e; }
++  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 16px;
 +  padding: 3px;
 +  spacing: 3px; }
 +  .screenshot-ui-shot-cast-container:ltr {
 +    margin-left: 3px; }
 +  .screenshot-ui-shot-cast-container:rtl {
 +    margin-right: 3px; }
 +
 +.screenshot-ui-shot-cast-button {
 +  padding: 6px 12px;
 +  background-color: transparent;
 +  border-radius: 13px; }
 +  .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
-     background-color: #606060; }
++    background-color: rgba(255, 255, 255, 0.2); }
 +  .screenshot-ui-shot-cast-button:active {
-     background-color: white;
-     color: black; }
++    background-color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button:checked {
-   #panel.unlock-screen, #panel.login-screen, #panel:overview {
-     background-color: transparent;
-     box-shadow: none; }
-     #panel.unlock-screen .panel-button, #panel.login-screen .panel-button, #panel:overview .panel-button {
-       transition-duration: 150ms;
-       border: 3px solid transparent;
-       border-radius: 99px;
-       font-weight: bold;
-       background-color: transparent;
-       color: #f2f2f2;
-       box-shadow: none; }
-       #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:overview, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:overview, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:active, #panel:overview .panel-button:overview, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
-         box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
-         #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:overview:hover, #panel.unlock-screen .panel-button:focus:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:overview:hover, #panel.login-screen .panel-button:focus:hover, #panel.login-screen .panel-button:checked:hover, #panel:overview .panel-button:active:hover, #panel:overview .panel-button:overview:hover, #panel:overview .panel-button:focus:hover, #panel:overview .panel-button:checked:hover {
-           box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); }
-       #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:hover, #panel:overview .panel-button:hover {
-         box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++    background-color: #ffffff;
++    color: #353535; }
 +  .screenshot-ui-shot-cast-button:insensitive {
 +    color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.screenshot-ui-show-pointer-button {
 +  border-radius: 99px;
 +  padding: 12px !important; }
 +  .screenshot-ui-show-pointer-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.3); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.5); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
 +  border: 2px white; }
 +
 +.screenshot-ui-area-selector-handle {
 +  border-radius: 99px;
 +  background-color: white;
 +  box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.2);
 +  width: 24px;
 +  height: 24px; }
 +
 +.screenshot-ui-window-selector {
 +  background-color: #353535; }
 +  .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
 +    margin: 100px; }
 +  .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
 +    margin-bottom: 200px; }
 +
 +.screenshot-ui-window-selector-window-border {
 +  transition-duration: 200ms;
 +  border-radius: 16px;
 +  border: 6px transparent; }
 +
 +.screenshot-ui-window-selector-check {
 +  transition-duration: 200ms;
 +  color: transparent;
 +  border-radius: 99px;
 +  border-width: 12px;
 +  icon-size: 24px; }
 +
 +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
 +  border-color: #185fb4; }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
 +  border-color: #3584e4;
 +  background-color: rgba(53, 132, 228, 0.2); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
 +  color: #ffffff;
 +  background-color: #3584e4; }
 +
 +.screenshot-ui-screen-selector {
 +  transition-duration: 200ms;
 +  background-color: rgba(0, 0, 0, 0.5); }
 +  .screenshot-ui-screen-selector:hover {
 +    background-color: rgba(0, 0, 0, 0.3); }
 +  .screenshot-ui-screen-selector:active {
 +    background-color: rgba(0, 0, 0, 0.7); }
 +  .screenshot-ui-screen-selector:checked {
 +    background-color: transparent;
 +    border: 2px white; }
 +
 +.screenshot-ui-tooltip {
 +  text-align: center;
 +  -y-offset: 24px; }
 +
 +/* Top Bar */
 +#panel {
 +  background-color: #000000;
 +  font-weight: bold;
 +  height: 2.2em;
 +  transition-duration: 250ms;
 +  box-shadow: inset 0 -1px 0 0 #000000; }
-     #panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
 +  #panel .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    border-radius: 99px;
 +    font-weight: bold;
 +    background-color: transparent;
 +    color: #f2f2f2;
 +    box-shadow: none;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 6px; }
-       #panel .panel-button:active:hover, #panel .panel-button:overview:hover, #panel .panel-button:focus:hover, #panel .panel-button:checked:hover {
++    #panel .panel-button:active, #panel .panel-button:focus, #panel .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.25); }
-       #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:overview, #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:checked {
++      #panel .panel-button:active:hover, #panel .panel-button:focus:hover, #panel .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35); }
 +    #panel .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.2); }
 +    #panel .panel-button .system-status-icon {
 +      icon-size: 1.09em;
 +      padding: 5px;
 +      margin: 0 4px; }
 +    #panel .panel-button .panel-status-indicators-box .system-status-icon,
 +    #panel .panel-button .panel-status-menu-box .system-status-icon {
 +      margin: 0; }
 +    #panel .panel-button .app-menu-icon {
 +      -st-icon-style: symbolic; }
 +    #panel #panelActivities.panel-button {
 +      -natural-hpadding: 18px; }
 +    #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
 +      spacing: 6px; }
 +    #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
 +      icon-size: 1.09em; }
 +    #panel .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
 +      color: #f2f2f2;
 +      box-shadow: inset 0 0 0 100px rgba(224, 27, 36, 0.8); }
-         #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:overview:hover, #panel .panel-button.screen-recording-indicator:focus:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
++      #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #e01b24; }
-       color: rgba(0, 0, 0, 0.8);
-       box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.8); }
-       #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:overview, #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:checked {
-         box-shadow: inset 0 0 0 100px #f6d32d; }
-         #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:overview:hover, #panel .panel-button.screen-sharing-indicator:focus:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
-           box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.95); }
++        #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:focus:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(224, 27, 36, 0.95); }
 +      #panel .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px rgba(224, 27, 36, 0.9); }
 +    #panel .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
-         box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.9); }
++      color: #f2f2f2;
++      box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.8); }
++      #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:checked {
++        box-shadow: inset 0 0 0 100px #ff7800; }
++        #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:focus:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
++          box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.95); }
 +      #panel .panel-button.screen-sharing-indicator:hover {
-       #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
++        box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.9); }
 +    #panel .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
 +      color: #f2f2f2;
 +      box-shadow: none;
 +      box-shadow: none !important; }
-         #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:overview:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
++      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.25); }
-       #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
++        #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35); }
 +      #panel .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.2); }
 +      #panel .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 99px; }
-         #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:overview .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
++      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
 +        box-shadow: none !important; }
-         #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:overview:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
-           box-shadow: none !important; }
-           #panel .panel-button.clock-display:active:hover .clock, #panel .panel-button.clock-display:overview:hover .clock, #panel .panel-button.clock-display:focus:hover .clock, #panel .panel-button.clock-display:checked:hover .clock {
-             box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35); }
++        #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
 +          box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.25); }
-   #panel .screencast-indicator,
-   #panel .remote-access-indicator {
-     color: #f6d32d; }
++          #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:focus .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
++            box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35) !important; }
 +      #panel .panel-button.clock-display:hover {
 +        box-shadow: none !important; }
 +        #panel .panel-button.clock-display:hover .clock {
 +          box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.2); }
++  #panel.unlock-screen, #panel.login-screen, #panel:overview {
++    background-color: transparent;
++    box-shadow: none; }
++    #panel.unlock-screen .panel-button, #panel.login-screen .panel-button, #panel:overview .panel-button {
++      transition-duration: 150ms;
++      border: 3px solid transparent;
++      border-radius: 99px;
++      font-weight: bold;
++      background-color: transparent;
++      color: #f6f5f4;
++      box-shadow: none; }
++      #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:active, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
++        box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
++        #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:focus:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:focus:hover, #panel.login-screen .panel-button:checked:hover, #panel:overview .panel-button:active:hover, #panel:overview .panel-button:focus:hover, #panel:overview .panel-button:checked:hover {
++          box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); }
++      #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:hover, #panel:overview .panel-button:hover {
++        box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++      #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display, #panel:overview .panel-button.clock-display {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: #f6f5f4;
++        box-shadow: none;
++        box-shadow: none !important; }
++        #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
++          box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
++          #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:focus:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:focus:hover, #panel.login-screen .panel-button.clock-display:checked:hover, #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:focus:hover, #panel:overview .panel-button.clock-display:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); }
++        #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:hover {
++          box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++        #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock, #panel:overview .panel-button.clock-display .clock {
++          transition-duration: 150ms;
++          border: 3px solid transparent;
++          border-radius: 99px; }
++        #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
++          box-shadow: none !important; }
++          #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:checked .clock, #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:checked .clock {
++            box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
++            #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:focus .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:focus .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover, #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:focus .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
++              box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35) !important; }
++        #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:hover {
++          box-shadow: none !important; }
++          #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:hover .clock, #panel:overview .panel-button.clock-display:hover .clock {
++            box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++      #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator, #panel:overview .panel-button.screen-recording-indicator {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: #f2f2f2;
++        box-shadow: inset 0 0 0 100px rgba(224, 27, 36, 0.8); }
++        #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:checked, #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:checked {
++          box-shadow: inset 0 0 0 100px #e01b24; }
++          #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover, #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:focus:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(224, 27, 36, 0.95); }
++        #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:hover, #panel:overview .panel-button.screen-recording-indicator:hover {
++          box-shadow: inset 0 0 0 100px rgba(224, 27, 36, 0.9); }
++      #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator, #panel:overview .panel-button.screen-sharing-indicator {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: rgba(0, 0, 0, 0.8);
++        box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.8); }
++        #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:checked, #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:checked {
++          box-shadow: inset 0 0 0 100px #f6d32d; }
++          #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover, #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:focus:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.95); }
++        #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:hover, #panel:overview .panel-button.screen-sharing-indicator:hover {
++          box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.9); }
 +  #panel .panel-status-indicators-box,
 +  #panel .panel-status-menu-box {
 +    spacing: 2px; }
 +  #panel .power-status.panel-status-indicators-box {
 +    spacing: 0; }
-   border-width: 0; }
++  #panel .privacy-indicator {
++    color: #ff7800; }
 +
 +#appMenu {
 +  spacing: 6px; }
 +  #appMenu .label-shadow {
 +    color: transparent; }
 +
 +#appMenu .panel-status-menu-box {
 +  padding: 0 6px;
 +  spacing: 6px; }
 +
 +.clock-display-box {
 +  spacing: 2px; }
 +  .clock-display-box .clock {
 +    padding-left: 12px;
 +    padding-right: 12px; }
 +
 +/* Activities Ripple */
 +.ripple-box {
 +  background-color: rgba(255, 255, 255, 0.2);
 +  box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
 +  width: 52px;
 +  height: 52px;
 +  border-radius: 0 0 52px 0; }
 +  .ripple-box:rtl {
 +    border-radius: 0 0 0 52px; }
 +
 +.quick-settings {
 +  padding: 18px;
 +  border-radius: 36px; }
 +  .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .background-app-item .close-button, .background-app-item .quick-settings .close-button, .quick-settings .button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .calendar .calendar-day, .calendar .quick-settings .calendar-day {
 +    padding: 10.5px; }
 +
 +.quick-settings-grid {
 +  spacing-rows: 12px;
 +  spacing-columns: 12px; }
 +
 +.quick-toggle, .quick-menu-toggle {
 +  border-radius: 99px;
 +  min-width: 12em;
 +  max-width: 12em;
 +  min-height: 48px;
 +  border: none; }
 +
 +.quick-toggle {
 +  /* Move padding into the box; this is to allow menu arrows
 +     to extend to the border */ }
 +  .quick-toggle:checked {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +    .quick-toggle:checked:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .quick-toggle:checked:hover, .quick-toggle:checked:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .quick-toggle:checked:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .quick-toggle:checked:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .quick-toggle > StBoxLayout {
 +    spacing: 9px; }
 +  .quick-toggle.button, .quick-toggle.icon-button, .quick-toggle.login-dialog-button.cancel-button, .quick-toggle.login-dialog-button.switch-user-button, .quick-toggle.login-dialog-button.login-dialog-session-list-button, .background-app-item .quick-toggle.close-button, .calendar .calendar-month-header .quick-toggle.pager-button, .calendar .quick-toggle.calendar-day {
 +    padding: 0; }
 +  .quick-toggle > StBoxLayout {
 +    padding: 0 12px; }
 +  .quick-toggle:ltr > StBoxLayout {
 +    padding-left: 15px; }
 +  .quick-toggle:rtl > StBoxLayout {
 +    padding-right: 15px; }
 +  .quick-toggle .quick-toggle-title {
 +    font-weight: bold; }
 +  .quick-toggle StBoxLayout > .quick-toggle-subtitle {
 +    font-weight: normal;
 +    font-size: 12px; }
 +  .quick-toggle .quick-toggle-icon {
 +    icon-size: 1.09em; }
 +
 +.quick-menu-toggle .quick-toggle {
 +  min-width: auto;
 +  max-width: auto; }
 +  .quick-menu-toggle .quick-toggle:ltr {
 +    border-radius: 99px 0 0 99px; }
 +  .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
 +    padding-right: 9px; }
 +  .quick-menu-toggle .quick-toggle:rtl {
 +    border-radius: 0 99px 99px 0; }
 +  .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
 +    padding-left: 9px; }
 +  .quick-menu-toggle .quick-toggle:ltr:last-child {
 +    border-radius: 99px; }
 +  .quick-menu-toggle .quick-toggle:rtl:last-child {
 +    border-radius: 99px; }
 +
 +.quick-menu-toggle .quick-toggle-arrow {
 +  padding: 6px 10.5px;
-   background-color: #353535;
++  border-width: 0;
++  border-color: rgba(255, 255, 255, 0.25); }
 +  .quick-menu-toggle .quick-toggle-arrow:checked {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff;
 +    border-color: #15539e; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:hover, .quick-menu-toggle .quick-toggle-arrow:checked:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .quick-menu-toggle .quick-toggle-arrow:ltr {
 +    border-radius: 0 99px 99px 0;
 +    border-left-width: 1px; }
 +  .quick-menu-toggle .quick-toggle-arrow:rtl {
 +    border-radius: 99px 0 0 99px;
 +    border-right-width: 1px; }
 +
 +.quick-slider > StBoxLayout {
 +  spacing: 6px; }
 +
 +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .background-app-item .close-button, .background-app-item .quick-slider .close-button {
 +  padding: 6px; }
 +
 +.quick-slider .slider-bin {
 +  min-height: 16px;
 +  padding: 6px;
 +  border-radius: 99px; }
 +  .quick-slider .slider-bin:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .quick-slider .slider-bin:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .quick-slider .slider-bin:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +
 +.quick-toggle-menu {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747;
 +  background-color: #353535 !important;
 +  color: white !important;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 12px 18px 0; }
 +  .quick-toggle-menu:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .quick-toggle-menu:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .quick-toggle-menu:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .quick-toggle-menu:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .quick-toggle-menu:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .quick-toggle-menu:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .quick-toggle-menu .popup-menu-item > StIcon {
 +    -st-icon-style: symbolic; }
 +  .quick-toggle-menu .header {
 +    spacing-rows: 3px;
 +    spacing-columns: 12px;
 +    padding-bottom: 12px; }
 +    .quick-toggle-menu .header .icon {
 +      icon-size: 1.635em;
 +      border-radius: 999px;
 +      padding: 9px;
 +      background-color: rgba(255, 255, 255, 0.2); }
 +      .quick-toggle-menu .header .icon.active {
 +        background-color: #3584e4;
 +        color: #ffffff; }
 +
 +.quick-settings-system-item > StBoxLayout {
 +  spacing: 12px; }
 +
 +.quick-settings-system-item .power-item {
 +  min-height: 0;
 +  min-width: 0; }
 +  .quick-settings-system-item .power-item:insensitive {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #474747;
 +    background-color: transparent; }
 +
 +.nm-network-item .wireless-secure-icon {
 +  icon-size: 0.545em; }
 +
 +.bt-device-item .popup-menu-icon {
 +  -st-icon-style: symbolic; }
 +
 +.bt-menu-placeholder.popup-menu-item {
 +  text-align: center;
 +  padding: 2em 4em; }
 +
 +.device-subtitle {
 +  color: rgba(255, 255, 255, 0.5); }
 +
++.keyboard-brightness-item .slider {
++  min-height: 16px; }
++
++.keyboard-brightness-level {
++  spacing: 6px; }
++  .keyboard-brightness-level .button:checked, .keyboard-brightness-level .icon-button:checked, .keyboard-brightness-level .login-dialog-button.cancel-button:checked, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked, .keyboard-brightness-level .background-app-item .close-button:checked, .background-app-item .keyboard-brightness-level .close-button:checked, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked, .keyboard-brightness-level .calendar .calendar-day:checked, .calendar .keyboard-brightness-level .calendar-day:checked {
++    transition-duration: 100ms;
++    background-color: #3584e4;
++    color: #ffffff; }
++    .keyboard-brightness-level .button:checked:focus, .keyboard-brightness-level .icon-button:checked:focus, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:focus, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:focus, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:focus, .keyboard-brightness-level .background-app-item .close-button:checked:focus, .background-app-item .keyboard-brightness-level .close-button:checked:focus, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:focus, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:focus, .keyboard-brightness-level .calendar .calendar-day:checked:focus, .calendar .keyboard-brightness-level .calendar-day:checked:focus {
++      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
++    .keyboard-brightness-level .button:checked:hover, .keyboard-brightness-level .icon-button:checked:hover, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:hover, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:hover, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:hover, .keyboard-brightness-level .background-app-item .close-button:checked:hover, .background-app-item .keyboard-brightness-level .close-button:checked:hover, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:hover, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:hover, .keyboard-brightness-level .calendar .calendar-day:checked:hover, .calendar .keyboard-brightness-level .calendar-day:checked:hover, .keyboard-brightness-level .button:checked:focus, .keyboard-brightness-level .icon-button:checked:focus, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:focus, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:focus, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:focus, .keyboard-brightness-level .background-app-item .close-button:checked:focus, .background-app-item .keyboard-brightness-level .close-button:checked:focus, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:focus, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:focus, .keyboard-brightness-level .calendar .calendar-day:checked:focus, .calendar .keyboard-brightness-level .calendar-day:checked:focus {
++      background-color: #4b92e7;
++      color: white; }
++    .keyboard-brightness-level .button:checked:active, .keyboard-brightness-level .icon-button:checked:active, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:active, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:active, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:active, .keyboard-brightness-level .background-app-item .close-button:checked:active, .background-app-item .keyboard-brightness-level .close-button:checked:active, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:active, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:active, .keyboard-brightness-level .calendar .calendar-day:checked:active, .calendar .keyboard-brightness-level .calendar-day:checked:active {
++      background-color: #1d72d8;
++      color: #ededed; }
++    .keyboard-brightness-level .button:checked:insensitive, .keyboard-brightness-level .icon-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:insensitive, .keyboard-brightness-level .background-app-item .close-button:checked:insensitive, .background-app-item .keyboard-brightness-level .close-button:checked:insensitive, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:insensitive, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:insensitive, .keyboard-brightness-level .calendar .calendar-day:checked:insensitive, .calendar .keyboard-brightness-level .calendar-day:checked:insensitive {
++      transition-duration: 100ms;
++      color: rgba(255, 255, 255, 0.5);
++      background-color: rgba(255, 255, 255, 0.05);
++      background-color: rgba(53, 132, 228, 0.5);
++      color: rgba(255, 255, 255, 0.5); }
++
 +.background-apps-quick-toggle {
 +  min-height: 40px;
 +  background-color: transparent; }
 +  .background-apps-quick-toggle StIcon {
 +    icon-size: 1.09em !important; }
 +
 +.background-app-item .popup-menu-icon {
 +  icon-size: 2.18em !important;
 +  -st-icon-style: regular !important; }
 +
 +.background-app-item .close-button {
 +  padding: 6px; }
 +
 +.background-app-item .spinner {
 +  padding: 6px; }
 +
 +.background-app-item.popup-inactive-menu-item {
 +  color: white; }
 +
 +/* OVERVIEW */
 +.controls-manager, .secondary-monitor-workspaces {
 +  spacing: 12px; }
 +
 +#overviewGroup {
 +  background-color: #282828; }
 +
 +.overview-controls {
 +  padding-bottom: 32px; }
 +
 +/* Window Picker */
 +.window-picker {
 +  spacing: 6px; }
 +
 +.window-close, .screenshot-ui-close-button {
 +  background-color: rgba(71, 71, 71, 0.98);
 +  color: #f6f5f4;
 +  border-radius: 99px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
 +  padding: 3px;
 +  height: 30px;
 +  width: 30px;
 +  transition-duration: 100ms; }
 +  .window-close StIcon, .screenshot-ui-close-button StIcon {
 +    icon-size: 24px; }
 +  .window-close:hover, .screenshot-ui-close-button:hover {
 +    background-color: rgba(88, 88, 88, 0.98); }
 +  .window-close:active, .screenshot-ui-close-button:active {
 +    background-color: rgba(104, 104, 104, 0.98); }
 +
 +.workspace-background {
 +  border-radius: 30px;
 +  background-color: rgba(3, 2, 1, 0);
 +  box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.2); }
 +
 +.search-entry {
 +  border-radius: 99px;
 +  margin-top: 12px;
 +  margin-bottom: 6px;
 +  width: 24em; }
 +  .search-entry .search-entry-icon {
 +    icon-size: 1.09em;
 +    margin-top: 2px;
 +    padding: 0 4px; }
 +
 +/* Search */
 +#searchResults {
 +  margin: 0 4px; }
 +
 +#searchResultsContent {
 +  max-width: 1072px; }
 +
 +.search-section {
 +  spacing: 18px; }
 +  .search-section .search-section-separator {
 +    height: 8px;
 +    background-color: transparent; }
 +
 +.search-section-content {
 +  background-color: #3d3d3c;
 +  color: #f6f5f4;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 0 12px; }
 +
 +.list-search-result, .search-provider-icon {
 +  background-color: transparent;
 +  border-radius: 11px; }
 +  .list-search-result:hover, .search-provider-icon:hover {
 +    background-color: rgba(246, 245, 244, 0.1); }
 +  .list-search-result:selected, .search-provider-icon:selected, .list-search-result:focus, .search-provider-icon:focus {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:focus:hover, .search-provider-icon:focus:hover {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:focus:active, .search-provider-icon:focus:active {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .list-search-result:active, .search-provider-icon:active {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .list-search-result:outlined, .search-provider-icon:outlined, .list-search-result:checked, .search-provider-icon:checked {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .list-search-result:outlined:active, .search-provider-icon:outlined:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .list-search-result:outlined:hover, .search-provider-icon:outlined:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .list-search-result:drop, .search-provider-icon:drop {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.search-statustext {
 +  color: rgba(246, 245, 244, 0.8); }
 +
 +.grid-search-results {
 +  spacing: 30px;
 +  margin: 0 12px; }
 +
 +.search-provider-icon:ltr {
 +  margin-right: 4px; }
 +
 +.search-provider-icon:rtl {
 +  margin-left: 4px; }
 +
 +.search-provider-icon .list-search-provider-content {
 +  spacing: 12px; }
 +  .search-provider-icon .list-search-provider-content .list-search-provider-details {
 +    width: 120px;
 +    color: #f6f5f4; }
 +
 +.list-search-results {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-content {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-title {
 +  spacing: 12px; }
 +
 +.list-search-result .list-search-result-description {
 +  color: #959594; }
 +
 +/* Dash */
 +#dash {
 +  margin-top: 12px; }
 +  #dash .placeholder {
 +    background-image: none;
 +    background-size: contain;
 +    height: 32px; }
 +  #dash .empty-dash-drop-target {
 +    width: 32px;
 +    height: 32px; }
 +  #dash .app-well-app-running-dot {
 +    margin-bottom: 14px; }
 +
 +.dash-background {
 +  background-color: #3d3d3c;
 +  border-radius: 28px;
 +  padding: 12px;
 +  spacing: 6px;
 +  margin-bottom: 12px; }
 +
 +.dash-item-container > * {
 +  margin: 0 2px; }
 +
 +.dash-item-container:ltr:first-child {
 +  margin-left: 0; }
 +
 +.dash-item-container:rtl:first-child {
 +  margin-right: 0; }
 +
 +.dash-item-container .app-well-app .overview-icon, .dash-item-container .grid-search-result .overview-icon {
 +  padding: 6px;
 +  border-radius: 16px; }
 +
 +.dash-item-container .show-apps {
 +  transition-duration: 400ms; }
 +  .dash-item-container .show-apps .overview-icon {
 +    background-color: transparent; }
 +  .dash-item-container .show-apps:hover .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +  .dash-item-container .show-apps:selected .overview-icon, .dash-item-container .show-apps:focus .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .dash-item-container .show-apps:selected .overview-icon:hover .overview-icon, .dash-item-container .show-apps:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .dash-item-container .show-apps:selected .overview-icon:active .overview-icon, .dash-item-container .show-apps:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .dash-item-container .show-apps:active .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .dash-item-container .show-apps:outlined .overview-icon, .dash-item-container .show-apps:checked .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .dash-item-container .show-apps:outlined .overview-icon:active .overview-icon, .dash-item-container .show-apps:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .dash-item-container .show-apps:outlined .overview-icon:hover .overview-icon, .dash-item-container .show-apps:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .dash-item-container .show-apps:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.dash-item-container .show-apps, .dash-item-container .app-well-app, .dash-item-container .grid-search-result {
 +  padding-bottom: 12px;
 +  color: #f6f5f4; }
 +
 +.dash-separator {
 +  width: 1px;
 +  margin: 0 4px;
 +  background-color: rgba(246, 245, 244, 0.1);
 +  margin-bottom: 12px; }
 +
 +.dash-label {
 +  -y-offset: 8px; }
 +
 +/* App Grid */
 +.icon-grid {
 +  row-spacing: 12px;
 +  column-spacing: 12px;
 +  max-row-spacing: 42px;
 +  max-column-spacing: 42px;
 +  page-padding-top: 24px;
 +  page-padding-bottom: 24px;
 +  page-padding-left: 18px;
 +  page-padding-right: 18px; }
 +
 +/* App Icons */
 +.app-well-app, .grid-search-result {
 +  transition-duration: 400ms; }
 +  .app-well-app .overview-icon, .grid-search-result .overview-icon {
 +    background-color: transparent; }
 +  .app-well-app:hover .overview-icon, .grid-search-result:hover .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app:selected .overview-icon, .grid-search-result:selected .overview-icon, .app-well-app:focus .overview-icon, .grid-search-result:focus .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .app-well-app:selected .overview-icon:hover .overview-icon, .grid-search-result:selected .overview-icon:hover .overview-icon, .app-well-app:focus .overview-icon:hover .overview-icon, .grid-search-result:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .app-well-app:selected .overview-icon:active .overview-icon, .grid-search-result:selected .overview-icon:active .overview-icon, .app-well-app:focus .overview-icon:active .overview-icon, .grid-search-result:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app:active .overview-icon, .grid-search-result:active .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .app-well-app:outlined .overview-icon, .grid-search-result:outlined .overview-icon, .app-well-app:checked .overview-icon, .grid-search-result:checked .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .app-well-app:outlined .overview-icon:active .overview-icon, .grid-search-result:outlined .overview-icon:active .overview-icon, .app-well-app:checked .overview-icon:active .overview-icon, .grid-search-result:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .app-well-app:outlined .overview-icon:hover .overview-icon, .grid-search-result:outlined .overview-icon:hover .overview-icon, .app-well-app:checked .overview-icon:hover .overview-icon, .grid-search-result:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .app-well-app:drop .overview-icon, .grid-search-result:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +  .app-well-app .overview-icon, .grid-search-result .overview-icon {
 +    padding: 12px;
 +    border-radius: 24px;
 +    color: #f6f5f4; }
 +  .app-well-app .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
 +    spacing: 6px; }
 +
 +.app-well-app.app-folder, .app-folder.grid-search-result {
 +  transition-duration: 400ms; }
 +  .app-well-app.app-folder .overview-icon, .app-folder.grid-search-result .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.07); }
 +  .app-well-app.app-folder:hover .overview-icon, .app-folder.grid-search-result:hover .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app.app-folder:selected .overview-icon, .app-folder.grid-search-result:selected .overview-icon, .app-well-app.app-folder:focus .overview-icon, .app-folder.grid-search-result:focus .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .app-well-app.app-folder:selected .overview-icon:hover .overview-icon, .app-folder.grid-search-result:selected .overview-icon:hover .overview-icon, .app-well-app.app-folder:focus .overview-icon:hover .overview-icon, .app-folder.grid-search-result:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .app-well-app.app-folder:selected .overview-icon:active .overview-icon, .app-folder.grid-search-result:selected .overview-icon:active .overview-icon, .app-well-app.app-folder:focus .overview-icon:active .overview-icon, .app-folder.grid-search-result:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app.app-folder:active .overview-icon, .app-folder.grid-search-result:active .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .app-well-app.app-folder:outlined .overview-icon, .app-folder.grid-search-result:outlined .overview-icon, .app-well-app.app-folder:checked .overview-icon, .app-folder.grid-search-result:checked .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .app-well-app.app-folder:outlined .overview-icon:active .overview-icon, .app-folder.grid-search-result:outlined .overview-icon:active .overview-icon, .app-well-app.app-folder:checked .overview-icon:active .overview-icon, .app-folder.grid-search-result:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .app-well-app.app-folder:outlined .overview-icon:hover .overview-icon, .app-folder.grid-search-result:outlined .overview-icon:hover .overview-icon, .app-well-app.app-folder:checked .overview-icon:hover .overview-icon, .app-folder.grid-search-result:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .app-well-app.app-folder:drop .overview-icon, .app-folder.grid-search-result:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.app-folder-dialog {
 +  border-radius: 64px;
-   box-shadow: inset 0 0 0 1px #424242; }
++  background-color: #3d3d3c;
 +  padding: 12px;
-       width: 12em; }
++  box-shadow: inset 0 0 0 1px rgba(246, 245, 244, 0.1); }
 +  .app-folder-dialog .folder-name-container {
 +    padding: 24px 36px 0;
 +    spacing: 12px;
 +    /* FIXME: this is to keep the label in sync with the entry */ }
 +    .app-folder-dialog .folder-name-container .folder-name-entry {
-       transition-duration: 100ms;
-       color: rgba(255, 255, 255, 0.5);
-       background-color: rgba(255, 255, 255, 0.05);
-       background-color: transparent;
-       color: rgba(255, 255, 255, 0.5); }
++      width: 12em;
++      color: #f6f5f4 !important; }
 +    .app-folder-dialog .folder-name-container .folder-name-label {
 +      padding: 5px 7px;
 +      color: #f6f5f4; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button {
 +      padding: 0;
 +      width: 36px;
 +      height: 36px;
 +      border-radius: 99px; }
 +      .app-folder-dialog .folder-name-container .edit-folder-button > StIcon {
 +        icon-size: 1.09em; }
 +  .app-folder-dialog .icon-grid {
 +    row-spacing: 12px;
 +    column-spacing: 30px;
 +    page-padding-top: 0;
 +    page-padding-bottom: 0;
 +    page-padding-left: 0;
 +    page-padding-right: 0; }
 +  .app-folder-dialog .page-indicators {
 +    margin-bottom: 18px; }
 +
 +.app-folder-dialog-container {
 +  padding: 12px;
 +  width: 720px;
 +  height: 720px; }
 +
 +.app-well-app-running-dot {
 +  height: 5px;
 +  width: 5px;
 +  border-radius: 5px;
 +  margin-bottom: 8px;
 +  background-color: #f6f5f4; }
 +
 +.rename-folder-popup .rename-folder-popup-item {
 +  spacing: 6px; }
 +  .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
 +    padding: 0 12px; }
 +
 +.page-indicator {
 +  padding: 6px 12px 0;
 +  transition-duration: 400ms; }
 +  .page-indicator .page-indicator-icon {
 +    width: 10px;
 +    height: 10px;
 +    border-radius: 10px;
 +    background-color: white;
 +    transition-duration: 400ms; }
 +
 +.apps-scroll-view {
 +  padding: 0; }
 +
 +.system-action-icon {
 +  background-color: rgba(246, 245, 244, 0.1);
 +  color: #f6f5f4;
 +  border-radius: 99px;
 +  icon-size: 48px; }
 +
 +.page-navigation-hint.dnd {
 +  background: rgba(255, 255, 255, 0.1); }
 +
 +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
 +  background-gradient-start: rgba(255, 255, 255, 0.05);
 +  background-gradient-end: transparent;
 +  background-gradient-direction: horizontal;
 +  border-radius: 24px 0px 0px 24px; }
 +
 +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
 +  background-gradient-start: transparent;
 +  background-gradient-end: rgba(255, 255, 255, 0.05);
 +  background-gradient-direction: horizontal;
 +  border-radius: 0px 24px 24px 0px; }
 +
 +.page-navigation-arrow {
 +  margin: 6px;
 +  padding: 18px;
 +  width: 24px;
 +  height: 24px;
 +  border-radius: 99px;
 +  transition-duration: 100ms; }
 +  .page-navigation-arrow > StIcon {
 +    color: #f6f5f4; }
 +  .page-navigation-arrow:insensitive {
 +    transition-duration: 100ms;
 +    background-color: transparent;
 +    background-color: none;
 +    box-shadow: none; }
 +    .page-navigation-arrow:insensitive:insensitive {
-   border-radius: 0 0 16px 16px;
++      background-color: transparent; }
 +  .page-navigation-arrow:hover {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: rgba(105, 105, 105, 0.545); }
 +  .page-navigation-arrow:active {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: rgba(112, 112, 112, 0.545); }
 +
 +/* Workspace pager */
 +.workspace-thumbnails {
 +  visible-width: 32px;
 +  spacing: 6px;
 +  padding: 6px; }
 +  .workspace-thumbnails .workspace-thumbnail {
 +    color: #f6f5f4;
 +    background-color: #4e4e4e;
 +    border-radius: 4px;
 +    border: 1px solid transparent; }
 +  .workspace-thumbnails .placeholder {
 +    background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
 +    background-size: contain;
 +    width: 18px; }
 +
 +.workspace-thumbnail-indicator {
 +  border: 3px solid #3584e4;
 +  border-radius: 8px; }
 +
 +.ripple-pointer-location {
 +  width: 50px;
 +  height: 50px;
 +  border-radius: 25px;
 +  background-color: rgba(188, 214, 246, 0.3);
 +  box-shadow: 0 0 2px 2px #8fbbf0; }
 +
 +.pie-timer {
 +  width: 60px;
 +  height: 60px;
 +  -pie-border-width: 3px;
 +  -pie-border-color: #3584e4;
 +  -pie-background-color: rgba(233, 242, 252, 0.3); }
 +
 +.magnifier-zoom-region {
 +  border: 2px solid #3584e4; }
 +  .magnifier-zoom-region.full-screen {
 +    border-width: 0; }
 +
 +.select-area-rubberband {
 +  background-color: rgba(53, 132, 228, 0.3);
 +  border: 1px solid #3584e4; }
 +
 +.user-icon {
 +  background-size: contain;
 +  color: #ffffff;
 +  border-radius: 99px;
 +  icon-size: 4.36em; }
 +  .user-icon StIcon {
 +    background-color: rgba(255, 255, 255, 0.05);
 +    border-radius: 99px;
 +    padding: 12px;
 +    width: 2.725em;
 +    height: 2.725em; }
 +  .user-icon.user-avatar {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); }
 +
 +.lightbox {
 +  background-color: black; }
 +
 +.flashspot {
 +  background-color: white; }
 +
 +.hidden {
 +  color: transparent; }
 +
 +.caps-lock-warning-label {
 +  text-align: center;
 +  padding-bottom: 8px;
 +  color: #f6d32d; }
 +
 +/* Workspace animation */
 +.workspace-animation {
 +  background-color: #353535; }
 +
 +/* Tiled window previews */
 +.tile-preview {
 +  background-color: rgba(53, 132, 228, 0.5);
 +  border: 1px solid #3584e4; }
 +
 +/* On-screen Keyboard */
 +#keyboard {
 +  background-color: #353535;
 +  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); }
 +  #keyboard .page-indicator {
 +    padding: 6px; }
 +    #keyboard .page-indicator .page-indicator-icon {
 +      width: 8px;
 +      height: 8px; }
 +
 +.key-container {
 +  padding: 4px;
 +  spacing: 4px; }
 +
 +.keyboard-key {
 +  font-size: 16pt;
 +  font-weight: bold;
 +  min-height: 1.2em;
 +  min-width: 1.2em;
 +  border-width: 1px;
 +  border-style: solid;
 +  border-radius: 12px;
 +  box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2);
 +  color: #ffffff;
 +  background-color: #545454; }
 +  .keyboard-key:focus {
 +    color: #ffffff;
 +    background-color: #3c444d;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +    .keyboard-key:focus:hover {
 +      background-color: #474f59;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .keyboard-key:focus:active {
 +      background-color: #4c545d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +  .keyboard-key:hover {
 +    color: #ffffff;
 +    background-color: #5e5e5e; }
 +  .keyboard-key:active {
 +    color: #ffffff;
 +    background-color: #666666; }
 +  .keyboard-key:checked {
 +    color: #ffffff;
 +    background-color: #737373; }
 +  .keyboard-key:grayed {
 +    background-color: #2d2d2d;
 +    color: #ffffff;
 +    border-color: rgba(255, 255, 255, 0.1); }
 +  .keyboard-key.default-key {
 +    color: #ffffff;
 +    background-color: #3b3b3b;
 +    border-radius: 12px; }
 +    .keyboard-key.default-key:hover {
 +      color: #ffffff;
 +      background-color: #454545; }
 +    .keyboard-key.default-key:active {
 +      color: #ffffff;
 +      background-color: #4d4d4d; }
 +    .keyboard-key.default-key:checked {
 +      color: #ffffff;
 +      background-color: #595959; }
 +    .keyboard-key.default-key:latched {
 +      border-color: #4b92e7;
 +      background-color: #3584e4; }
 +  .keyboard-key.enter-key {
 +    color: #ffffff;
 +    background-color: #428ce6;
 +    border-radius: 12px;
 +    color: #ffffff; }
 +    .keyboard-key.enter-key:hover {
 +      color: #ffffff;
 +      background-color: #5497e8; }
 +    .keyboard-key.enter-key:active {
 +      color: #ffffff;
 +      background-color: #629fea; }
 +    .keyboard-key.enter-key:checked {
 +      color: #ffffff;
 +      background-color: #78aded; }
 +  .keyboard-key.shift-key-uppercase {
 +    background-color: gray;
 +    color: #353535; }
 +    .keyboard-key.shift-key-uppercase:hover {
 +      background-color: #8c8c8c;
 +      color: #424242; }
 +  .keyboard-key StIcon {
 +    icon-size: 24px; }
 +
 +.keyboard-subkeys {
 +  -arrow-border-radius: 16px;
 +  -arrow-background-color: #353535;
 +  -arrow-border-width: 1px;
 +  -arrow-border-color: #4c4c4c;
 +  -arrow-base: 20px;
 +  -arrow-rise: 10px;
 +  -boxpointer-gap: 6px;
 +  padding: 6px; }
 +  .keyboard-subkeys .keyboard-key {
 +    color: #ffffff;
 +    background-color: #545454;
 +    border-radius: 12px; }
 +    .keyboard-subkeys .keyboard-key:focus {
 +      color: #ffffff;
 +      background-color: #3c444d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +      .keyboard-subkeys .keyboard-key:focus:hover {
 +        background-color: #474f59;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +      .keyboard-subkeys .keyboard-key:focus:active {
 +        background-color: #4c545d;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .keyboard-subkeys .keyboard-key:hover {
 +      color: #ffffff;
 +      background-color: #5e5e5e; }
 +    .keyboard-subkeys .keyboard-key:active {
 +      color: #ffffff;
 +      background-color: #666666; }
 +    .keyboard-subkeys .keyboard-key:checked {
 +      color: #ffffff;
 +      background-color: #737373; }
 +
 +.emoji-page .keyboard-key {
 +  background-color: transparent;
 +  border: none;
 +  color: initial; }
 +
 +.emoji-panel .keyboard-key:latched {
 +  border-color: #4b92e7;
 +  background-color: #3584e4; }
 +
 +.word-suggestions {
 +  font-size: 12pt;
 +  spacing: 12px;
 +  min-height: 17pt;
 +  padding: 12px;
 +  color: #ffffff; }
 +  .word-suggestions StButton {
 +    margin: 0 3px;
 +    min-width: 32px;
 +    border-radius: 6px;
 +    padding: 0px 18px;
 +    background-color: transparent;
 +    background-image: none; }
 +    .word-suggestions StButton:focus {
 +      color: #ffffff;
 +      background-color: #3c444d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +      .word-suggestions StButton:focus:hover {
 +        background-color: #474f59;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +      .word-suggestions StButton:focus:active {
 +        background-color: #4c545d;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .word-suggestions StButton:hover {
 +      color: #ffffff;
 +      background-color: #5e5e5e; }
 +    .word-suggestions StButton:active {
 +      color: #ffffff;
 +      background-color: #666666; }
 +    .word-suggestions StButton:checked {
 +      color: #ffffff;
 +      background-color: #737373; }
 +
 +/* Looking Glass */
 +#LookingGlassDialog {
 +  background-color: rgba(53, 53, 53, 0.98);
 +  color: #ffffff;
++  border-radius: 16px;
++  margin-top: 4px;
 +  border-top-width: 0;
 +  padding: 6px;
 +  spacing: 6px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
 +  #LookingGlassDialog > #Toolbar {
 +    border: none;
 +    padding: 6px;
 +    border-radius: 0;
 +    background-color: transparent;
 +    spacing: 6px; }
 +    #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +      padding: 6px 12px; }
 +      #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
 +        icon-size: 1.09em; }
 +  #LookingGlassDialog .labels {
 +    spacing: 6px; }
 +  #LookingGlassDialog .notebook-tab {
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 12px;
 +    padding: 6px 12px; }
 +  #LookingGlassDialog StBoxLayout#EvalBox {
 +    padding: 4px;
 +    spacing: 6px;
 +    padding: 6px; }
 +  #LookingGlassDialog StBoxLayout#ResultsArea {
 +    spacing: 6px;
 +    padding: 6px; }
 +
 +.lg-dialog StEntry {
 +  min-height: 22px; }
 +
 +.lg-dialog .shell-link {
 +  color: #8fbbf0; }
 +  .lg-dialog .shell-link:hover {
 +    color: #bcd6f6; }
 +  .lg-dialog .shell-link:active {
 +    color: #629fea; }
 +
 +.lg-dialog .actor-link {
 +  color: #9a9a9a; }
 +  .lg-dialog .actor-link:hover {
 +    color: #cdcdcd; }
 +  .lg-dialog .actor-link:active {
 +    color: #676767; }
 +  .lg-dialog .actor-link StIcon {
 +    icon-size: 12px; }
 +
 +.lg-completions-text {
 +  font-style: italic; }
 +
 +.lg-obj-inspector-title {
 +  spacing: 6px; }
 +
 +.lg-obj-inspector-button {
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  padding: 4px;
 +  border-radius: 8px; }
 +  .lg-obj-inspector-button:hover {
 +    border: 1px solid white; }
 +
 +#lookingGlassExtensions {
 +  padding: 6px; }
 +
 +.lg-extensions-list {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +.lg-extension {
 +  padding: 12px;
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: white;
 +  background-color: #474747; }
 +  .lg-extension:hover {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #4f4f4f; }
 +  .lg-extension:active {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #565656; }
 +  .lg-extension:focus {
 +    transition-duration: 100ms;
 +    color: white;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .lg-extension:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .lg-extension:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .lg-extension:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +
 +.lg-extension-meta {
 +  spacing: 6px; }
 +
 +#LookingGlassPropertyInspector {
 +  background: #353535;
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  border-radius: 8px;
 +  padding: 6px; }
 +
 +.lg-debug-flag-button {
 +  color: #ffffff; }
 +  .lg-debug-flag-button StLabel {
 +    padding: 6px, 12px; }
 +  .lg-debug-flag-button:hover {
 +    color: white; }
 +  .lg-debug-flag-button:active {
 +    color: #cccccc; }
 +
 +.lg-debug-flags-header {
 +  padding-top: 12px;
 +  padding: 6px; }
 +
 +.login-dialog .caps-lock-warning-label,
 +.login-dialog .login-dialog-message-warning,
 +.unlock-dialog .caps-lock-warning-label,
 +.unlock-dialog .login-dialog-message-warning {
 +  color: #f6f5f4; }
 +
 +/* Login Dialog */
 +.login-dialog {
 +  background-color: #353535; }
 +
 +.login-dialog-button.cancel-button {
 +  padding: 9px; }
 +
 +.login-dialog-button-box {
 +  width: 23em;
 +  spacing: 12px; }
 +
 +.login-dialog-logo-bin {
 +  margin: 3em 0; }
 +
 +.login-dialog-banner {
 +  color: #dfdcd8; }
 +
 +.login-dialog-banner-view {
 +  max-width: 23em; }
 +
 +.login-dialog-message {
 +  text-align: center; }
 +
 +.login-dialog-user-selection-box {
 +  padding: 100px 0px; }
 +
 +.login-dialog-not-listed-label {
 +  font-size: 11pt;
 +  font-weight: bold;
 +  color: #b1a9a0;
 +  padding: 12px; }
 +  .login-dialog-not-listed-button:focus .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
 +    color: #f6f5f4; }
 +  .login-dialog-not-listed-button:focus .login-dialog-not-listed-label {
 +    text-decoration: underline; }
 +
 +.login-dialog-auth-list-view {
 +  -st-vfade-offset: 1em; }
 +
 +.login-dialog-auth-list {
 +  spacing: 6px;
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-title {
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-item {
 +  border-radius: 16px;
 +  padding: 4px;
 +  color: #b1a9a0; }
 +  .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +
 +.login-dialog-auth-list-label {
 +  font-size: 13pt;
 +  font-weight: bold;
 +  padding-left: 15px; }
 +  .login-dialog-auth-list-label:ltr {
 +    padding-left: 14px;
 +    text-align: left; }
 +  .login-dialog-auth-list-label:rtl {
 +    padding-right: 14px;
 +    text-align: right; }
 +
 +.login-dialog-user-list-view {
 +  -st-vfade-offset: 1em; }
 +
 +.login-dialog-user-list {
 +  spacing: 12px;
 +  width: 23em; }
 +  .login-dialog-user-list .login-dialog-user-list-item {
 +    border-radius: 12px;
 +    padding: 6px;
 +    background-color: rgba(246, 245, 244, 0.05);
 +    color: #f6f5f4; }
 +    .login-dialog-user-list .login-dialog-user-list-item .user-widget .user-icon {
 +      border: 4px solid transparent; }
 +    .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
 +      height: 2px;
 +      margin-top: 6px;
 +      background-color: #b1a9a0; }
 +    .login-dialog-user-list .login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
 +      background-color: #ffffff; }
 +  .login-dialog-user-list:expanded .login-dialog-user-list-item {
 +    transition-duration: 300ms;
 +    transition-timing-function: ease; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:hover {
 +      background-color: rgba(246, 245, 244, 0.1);
 +      color: #f6f5f4; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
 +      background-color: #3584e4;
 +      color: #ffffff; }
 +      .login-dialog-user-list:expanded .login-dialog-user-list-item:selected:hover {
 +        background-color: #4b92e7; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in .user-widget .user-icon {
 +      border-color: #3584e4; }
 +
 +.login-dialog-prompt-layout {
 +  spacing: 12px;
 +  width: 26em; }
 +
 +/* Screen Shield */
 +.unlock-dialog {
 +  background-color: transparent; }
 +
 +.screen-shield-background {
 +  background: black;
 +  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
 +
 +#lockDialogGroup {
 +  background-color: #353535; }
 +
 +.unlock-dialog-clock {
 +  color: #f6f5f4;
 +  spacing: 2em; }
 +  .unlock-dialog-clock .unlock-dialog-clock-time {
 +    font-size: 72pt;
 +    font-weight: 200; }
 +  .unlock-dialog-clock .unlock-dialog-clock-date {
 +    font-weight: 400; }
 +  .unlock-dialog-clock .unlock-dialog-clock-hint {
 +    margin-top: 2em;
 +    padding: 6px 18px;
 +    border-radius: 16px;
 +    font-weight: bold; }
 +
 +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
 +  background-color: rgba(53, 53, 53, 0.3); }
 +  #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
 +    background-color: rgba(53, 53, 53, 0.5); }
 +  #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
 +    background-color: rgba(53, 132, 228, 0.5); }
 +
 +.unlock-dialog-notifications-container {
 +  margin: 12px;
 +  spacing: 6px;
 +  width: 23em;
 +  background-color: transparent; }
 +  .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
 +    padding-top: 0;
 +    padding-bottom: 0; }
 +  .unlock-dialog-notifications-container .notification,
 +  .unlock-dialog-notifications-container .unlock-dialog-notification-source {
 +    padding: 12px 16px;
 +    border: none;
 +    background-color: rgba(246, 245, 244, 0.1);
 +    color: #f6f5f4;
 +    border-radius: 16px; }
 +    .unlock-dialog-notifications-container .notification.critical,
 +    .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
 +      background-color: rgba(246, 245, 244, 0.2); }
 +
 +.unlock-dialog-notification-label {
 +  padding-left: 12px;
 +  padding-right: 0; }
 +  .unlock-dialog-notification-label:rtl {
 +    padding-right: 12px;
 +    padding-left: 0; }
 +
 +.unlock-dialog-notification-count-text {
 +  font-weight: bold;
 +  padding: 0 12px;
 +  color: #f6f5f4;
 +  background-color: rgba(246, 245, 244, 0.1);
 +  border-radius: 99px; }
 +
 +.user-widget .user-widget-label {
 +  color: #f6f5f4; }
 +
 +.user-widget.horizontal {
 +  spacing: 18px; }
 +  .user-widget.horizontal .user-icon StIcon {
 +    padding: 12px;
 +    icon-size: 2.18em;
 +    width: 3.27em;
 +    height: 3.27em;
 +    background-color: rgba(246, 245, 244, 0.1); }
 +
 +.user-widget.vertical {
 +  spacing: 24px; }
 +  .user-widget.vertical .user-widget-label {
 +    text-align: center;
 +    margin-bottom: .75em; }
 +  .user-widget.vertical .user-icon {
 +    icon-size: 10.9em; }
 +    .user-widget.vertical .user-icon StIcon {
 +      padding: 32px;
 +      icon-size: 4.36em;
 +      background-color: rgba(246, 245, 244, 0.1); }
index c8c896a530f6f3f67abc0c7eadbc435204f55ed4,0000000000000000000000000000000000000000..474d042a49805090a8fe7225de692699732a5258
mode 100644,000000..100644
--- /dev/null
@@@ -1,2945 -1,0 +1,3001 @@@
-   background-color: #333333;
 +/* This stylesheet is generated, DO NOT EDIT */
 +/* Copyright 2009, 2015 Red Hat, Inc.
 + *
 + * Portions adapted from Mx's data/style/default.css
 + *   Copyright 2009 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU Lesser General Public License,
 + * version 2.1, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT ANY
 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 + * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 + */
 +/* Global Values */
 +stage {
 +  font-size: 11pt;
 +  color: #ffffff; }
 +
 +/* Common Stylings */
 +.app-well-app.app-folder .overview-icon, .app-folder.grid-search-result .overview-icon, .app-well-app .overview-icon, .grid-search-result .overview-icon, .dash-item-container .show-apps .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box {
 +  border-radius: 16px;
 +  padding: 6px;
 +  spacing: 6px;
 +  border: 2px solid transparent;
 +  transition-duration: 200ms;
 +  text-align: center;
 +  color: inherit;
 +  border-color: rgba(255, 255, 255, 0.3); }
 +
 +#LookingGlassDialog .notebook-tab, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, .app-folder-dialog .folder-name-container .edit-folder-button, .button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  border-radius: 8px;
 +  border-style: solid;
 +  border-width: 1px;
 +  font-weight: bold;
 +  padding: 3px 24px; }
 +
 +.app-folder-dialog .folder-name-container .edit-folder-button, .button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:focus, .button:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .pager-button:focus, .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .close-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:focus:hover, .button:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .background-app-item .close-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:focus:active, .button:focus:active, .calendar .calendar-day:focus:active, .calendar .calendar-month-header .pager-button:focus:active, .icon-button:focus:active, .login-dialog-button.cancel-button:focus:active, .login-dialog-button.switch-user-button:focus:active, .login-dialog-button.login-dialog-session-list-button:focus:active, .background-app-item .close-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:hover, .button:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .pager-button:hover, .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .close-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:insensitive, .button:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .close-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:selected, .button:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .pager-button:selected, .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .background-app-item .close-button:selected, .app-folder-dialog .folder-name-container .edit-folder-button:active, .button:active, .calendar .calendar-day:active, .calendar .calendar-month-header .pager-button:active, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .close-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:checked, .button:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .pager-button:checked, .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .background-app-item .close-button:checked {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #5e5e5e; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:checked:hover, .button:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .background-app-item .close-button:checked:hover {
 +      background-color: #666666; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:checked:active, .button:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .background-app-item .close-button:checked:active {
 +      background-color: #6d6d6d; }
 +  .app-folder-dialog .folder-name-container .default.edit-folder-button, .default.button, .calendar .default.calendar-day, .calendar .calendar-day.calendar-today, .calendar .calendar-month-header .default.pager-button, .default.icon-button, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .background-app-item .default.close-button {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:focus, .default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:hover, .default.button:hover, .calendar .default.calendar-day:hover, .calendar .calendar-day.calendar-today:hover, .calendar .calendar-month-header .default.pager-button:hover, .default.icon-button:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .default.close-button:hover, .app-folder-dialog .folder-name-container .default.edit-folder-button:focus, .default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:active, .default.button:active, .calendar .default.calendar-day:active, .calendar .calendar-day.calendar-today:active, .calendar .calendar-month-header .default.pager-button:active, .default.icon-button:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .default.close-button:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:insensitive, .default.button:insensitive, .calendar .default.calendar-day:insensitive, .calendar .calendar-day.calendar-today:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .default.icon-button:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .default.close-button:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .app-folder-dialog .folder-name-container .flat.edit-folder-button, .calendar .app-folder-dialog .folder-name-container .calendar-day.edit-folder-button, .app-folder-dialog .folder-name-container .calendar .calendar-day.edit-folder-button, .flat.button, .calendar .button.calendar-day, .calendar .calendar-day.calendar-today, .calendar .flat.calendar-day, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .flat.icon-button, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .background-app-item .flat.close-button, .calendar .icon-button.calendar-day, .calendar .calendar-day.login-dialog-button.cancel-button, .calendar .calendar-day.login-dialog-button.switch-user-button, .calendar .calendar-day.login-dialog-button.login-dialog-session-list-button, .calendar .background-app-item .calendar-day.close-button, .background-app-item .calendar .calendar-day.close-button {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #474747;
 +    background-color: transparent;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus, .flat.button:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .pager-button:focus, .flat.icon-button:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .flat.close-button:focus {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #454d57;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus:hover, .flat.button:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .flat.icon-button:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .background-app-item .flat.close-button:focus:hover {
 +        background-color: #4c545e;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus:active, .flat.button:focus:active, .calendar .calendar-day:focus:active, .calendar .calendar-month-header .pager-button:focus:active, .flat.icon-button:focus:active, .flat.login-dialog-button.cancel-button:focus:active, .flat.login-dialog-button.switch-user-button:focus:active, .flat.login-dialog-button.login-dialog-session-list-button:focus:active, .background-app-item .flat.close-button:focus:active {
 +        background-color: #535b64;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:hover, .flat.button:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .pager-button:hover, .flat.icon-button:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .flat.close-button:hover {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #4f4f4f; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:insensitive, .flat.button:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .flat.icon-button:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .flat.close-button:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05); }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:selected, .flat.button:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .pager-button:selected, .flat.icon-button:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .background-app-item .flat.close-button:selected, .app-folder-dialog .folder-name-container .flat.edit-folder-button:active, .flat.button:active, .calendar .calendar-day:active, .calendar .calendar-month-header .pager-button:active, .flat.icon-button:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .flat.close-button:active {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #565656; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked, .flat.button:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .pager-button:checked, .flat.icon-button:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .background-app-item .flat.close-button:checked {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #5e5e5e; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked:hover, .flat.button:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .flat.icon-button:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .background-app-item .flat.close-button:checked:hover {
 +        background-color: #666666; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked:active, .flat.button:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .flat.icon-button:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .background-app-item .flat.close-button:checked:active {
 +        background-color: #6d6d6d; }
 +    .app-folder-dialog .folder-name-container .flat.default.edit-folder-button, .flat.default.button, .calendar .default.calendar-day, .calendar .calendar-day.calendar-today, .calendar .calendar-month-header .default.pager-button, .default.icon-button, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .background-app-item .default.close-button {
 +      transition-duration: 100ms;
 +      background-color: #3584e4;
 +      color: #ffffff; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:focus, .flat.default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +        box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:hover, .flat.default.button:hover, .calendar .default.calendar-day:hover, .calendar .calendar-day.calendar-today:hover, .calendar .calendar-month-header .default.pager-button:hover, .default.icon-button:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .default.close-button:hover, .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:focus, .flat.default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +        background-color: #4b92e7;
 +        color: white; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:active, .flat.default.button:active, .calendar .default.calendar-day:active, .calendar .calendar-day.calendar-today:active, .calendar .calendar-month-header .default.pager-button:active, .default.icon-button:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .default.close-button:active {
 +        background-color: #1d72d8;
 +        color: #ededed; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:insensitive, .flat.default.button:insensitive, .calendar .default.calendar-day:insensitive, .calendar .calendar-day.calendar-today:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .default.icon-button:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .default.close-button:insensitive {
 +        transition-duration: 100ms;
 +        color: rgba(255, 255, 255, 0.5);
 +        background-color: rgba(255, 255, 255, 0.05);
 +        background-color: rgba(53, 132, 228, 0.5);
 +        color: rgba(255, 255, 255, 0.5); }
 +
 +.login-dialog-prompt-entry, .search-entry, .lg-dialog StEntry, StEntry {
 +  border-radius: 8px;
 +  padding: 9px 9px;
 +  selection-background-color: #3584e4;
 +  selected-color: #ffffff; }
 +
 +StEntry {
 +  transition-duration: 100ms;
 +  background-color: rgba(255, 255, 255, 0.15);
 +  color: rgba(255, 255, 255, 0.7);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  StEntry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25); }
 +  StEntry:focus {
 +    transition-duration: 100ms;
 +    background-color: rgba(201, 222, 248, 0.2875);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
 +    color: #ffffff; }
 +  StEntry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25);
 +    color: rgba(255, 255, 255, 0.5); }
 +  StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +.modal-dialog .modal-dialog-linked-button, .hotplug-notification-item, .notification-banner .notification-button {
 +  padding: 12px;
 +  font-weight: bold !important;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #525252;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .modal-dialog .modal-dialog-linked-button:ltr, .hotplug-notification-item:ltr, .notification-banner .notification-button:ltr {
 +    margin-right: 1px; }
 +  .modal-dialog .modal-dialog-linked-button:rtl, .hotplug-notification-item:rtl, .notification-banner .notification-button:rtl {
 +    margin-left: 1px; }
 +  .modal-dialog .modal-dialog-linked-button:insensitive, .hotplug-notification-item:insensitive, .notification-banner .notification-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .modal-dialog .modal-dialog-linked-button:focus, .hotplug-notification-item:focus, .notification-banner .notification-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f5761;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .modal-dialog .modal-dialog-linked-button:focus:hover, .hotplug-notification-item:focus:hover, .notification-banner .notification-button:focus:hover {
 +      background-color: #565e67;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .modal-dialog .modal-dialog-linked-button:focus:active, .hotplug-notification-item:focus:active, .notification-banner .notification-button:focus:active {
 +      background-color: #5d656e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .modal-dialog .modal-dialog-linked-button:hover, .hotplug-notification-item:hover, .notification-banner .notification-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #5a5a5a; }
 +  .modal-dialog .modal-dialog-linked-button:active, .hotplug-notification-item:active, .notification-banner .notification-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #616161; }
 +  .modal-dialog .modal-dialog-linked-button:checked, .hotplug-notification-item:checked, .notification-banner .notification-button:checked {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: dimgray; }
 +    .modal-dialog .modal-dialog-linked-button:checked:hover, .hotplug-notification-item:checked:hover, .notification-banner .notification-button:checked:hover {
 +      background-color: #717171; }
 +    .modal-dialog .modal-dialog-linked-button:checked:active, .hotplug-notification-item:checked:active, .notification-banner .notification-button:checked:active {
 +      background-color: #787878; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:ltr, .hotplug-notification-item:first-child:ltr, .notification-banner .notification-button:first-child:ltr {
 +    border-radius: 0 0 0 16px; }
 +  .modal-dialog .modal-dialog-linked-button:last-child:ltr, .hotplug-notification-item:last-child:ltr, .notification-banner .notification-button:last-child:ltr {
 +    border-radius: 0 0 16px;
 +    margin-right: 0 !important; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:rtl, .hotplug-notification-item:first-child:rtl, .notification-banner .notification-button:first-child:rtl {
 +    border-radius: 0 0 16px; }
 +  .modal-dialog .modal-dialog-linked-button:last-child:rtl, .hotplug-notification-item:last-child:rtl, .notification-banner .notification-button:last-child:rtl {
 +    border-radius: 0 0 0 16px;
 +    margin-left: 0 !important; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:last-child, .hotplug-notification-item:first-child:last-child, .notification-banner .notification-button:first-child:last-child {
 +    border-radius: 0 0 16px 16px;
 +    margin-left: 0 !important;
 +    margin-right: 0 !important; }
 +
 +.dash-label, .window-caption, .screenshot-ui-tooltip {
 +  background-color: rgba(0, 0, 0, 0.9);
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 99px;
 +  padding: 6px 12px;
 +  text-align: center;
 +  background-color: black;
 +  border-color: rgba(255, 255, 255, 0.3); }
 +
 +/* General Typography */
 +.user-widget.vertical .user-widget-label, .unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
 +  font-weight: 800;
 +  font-size: 20pt; }
 +
 +.lg-debug-flags-header, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
 +  font-weight: 800;
 +  font-size: 15pt; }
 +
 +.user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
 +  font-weight: 700;
 +  font-size: 15pt; }
 +
 +.bt-menu-placeholder.popup-menu-item, .message-dialog-content .message-dialog-title.lightweight, .headline {
 +  font-weight: 700;
 +  font-size: 13pt; }
 +
 +.lg-extension-name, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-forecast-temp, .weather-button .weather-header, .world-clocks-button .world-clocks-time, .world-clocks-button .world-clocks-header, .events-button .events-title, .calendar .calendar-month-header .calendar-month-label, .datemenu-today-button .day-label {
 +  font-weight: 700;
 +  font-size: 11pt; }
 +
 +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
 +  font-weight: 700;
 +  font-size: 9pt; }
 +
 +.lg-completions-text, .caps-lock-warning-label, #dash, .background-app-item .subtitle, .icon-label-button-container, .prompt-dialog-error-label,
 +.prompt-dialog-info-label,
 +.prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .weather-button .weather-forecast-time, .world-clocks-button .world-clocks-timezone, .events-button .event-time {
 +  font-weight: 400;
 +  font-size: 9pt; }
 +
 +.calendar .calendar-day {
 +  font-weight: 400;
 +  font-size: 8pt; }
 +
 +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-forecast-time, .world-clocks-button .world-clocks-timezone, .world-clocks-button .world-clocks-time, .events-button .event-time, .calendar .calendar-day {
 +  font-feature-settings: "tnum"; }
 +
 +/* OSD Elements */
 +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-monitor-label, .osd-window {
 +  color: #ffffff;
 +  background-color: #000000;
 +  border: 1px solid rgba(255, 255, 255, 0.2);
 +  border-radius: 999px;
 +  padding: 12px;
 +  border: 2px solid rgba(255, 255, 255, 0.3); }
 +
 +.lg-dialog StEntry {
 +  transition-duration: 100ms;
 +  background-color: rgba(255, 255, 255, 0.15);
 +  color: rgba(255, 255, 255, 0.7);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .lg-dialog StEntry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25); }
 +  .lg-dialog StEntry:focus {
 +    transition-duration: 100ms;
 +    background-color: rgba(201, 222, 248, 0.2875);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
 +    color: #ffffff; }
 +  .lg-dialog StEntry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25);
 +    color: rgba(255, 255, 255, 0.5); }
 +  .lg-dialog StEntry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +#LookingGlassDialog .notebook-tab, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  transition-duration: 100ms;
 +  color: #ffffff;
-     background-color: #333b45;
++  background-color: rgba(255, 255, 255, 0.1);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  #LookingGlassDialog .notebook-tab:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  #LookingGlassDialog .notebook-tab:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-       background-color: #3a424c;
++    background-color: rgba(118, 172, 237, 0.19);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    #LookingGlassDialog .notebook-tab:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
-       background-color: #414952;
++      background-color: rgba(118, 172, 237, 0.19);
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    #LookingGlassDialog .notebook-tab:focus:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:active, .screenshot-ui-show-pointer-button:focus:active, .screenshot-ui-type-button:focus:active {
-     background-color: #3b3b3b; }
++      background-color: rgba(118, 172, 237, 0.19);
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  #LookingGlassDialog .notebook-tab:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-     background-color: #424242; }
++    background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-     background-color: #4a4a4a; }
++    background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:outlined, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined, .screenshot-ui-show-pointer-button:outlined, .screenshot-ui-type-button:outlined, #LookingGlassDialog .notebook-tab:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
 +    transition-duration: 100ms;
 +    color: #ffffff;
-       background-color: #525252; }
++    background-color: rgba(255, 255, 255, 0.1); }
 +    #LookingGlassDialog .notebook-tab:outlined:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined:hover, .screenshot-ui-show-pointer-button:outlined:hover, .screenshot-ui-type-button:outlined:hover, #LookingGlassDialog .notebook-tab:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
-       background-color: #595959; }
++      background-color: rgba(255, 255, 255, 0.1); }
 +    #LookingGlassDialog .notebook-tab:outlined:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined:active, .screenshot-ui-show-pointer-button:outlined:active, .screenshot-ui-type-button:outlined:active, #LookingGlassDialog .notebook-tab:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++      background-color: rgba(255, 255, 255, 0.1); }
 +
 +.screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none; }
 +  .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
-       transition-duration: 100ms;
-       color: rgba(255, 255, 255, 0.5);
-       background-color: rgba(255, 255, 255, 0.05);
-       background-color: transparent;
-       color: rgba(255, 255, 255, 0.5); }
++    background-color: transparent; }
 +  .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    transition-duration: 100ms;
 +    background-color: transparent;
 +    background-color: none;
 +    box-shadow: none; }
 +    .screenshot-ui-show-pointer-button:insensitive:insensitive, .screenshot-ui-type-button:insensitive:insensitive {
-     background-color: rgba(201, 222, 248, 0.2875);
-     box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
++      background-color: transparent; }
 +
 +/* System Elements */
 +.login-dialog-prompt-entry, .search-entry {
 +  transition-duration: 100ms;
 +  background-color: rgba(255, 255, 255, 0.15);
 +  color: rgba(255, 255, 255, 0.7);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .login-dialog-prompt-entry:hover, .search-entry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25); }
 +  .login-dialog-prompt-entry:focus, .search-entry:focus {
 +    transition-duration: 100ms;
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++    background-color: rgba(255, 255, 255, 0.2625);
++    box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.2);
 +    color: #ffffff; }
 +  .login-dialog-prompt-entry:insensitive, .search-entry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(255, 255, 255, 0.25);
 +    color: rgba(255, 255, 255, 0.5); }
 +  .login-dialog-prompt-entry StLabel.hint-text, .search-entry StLabel.hint-text {
 +    color: rgba(255, 255, 255, 0.7); }
 +
 +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #3d3d3d;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #3c444e;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
 +      background-color: #434b55;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .login-dialog-button.cancel-button:focus:active, .login-dialog-button.switch-user-button:focus:active, .login-dialog-button.login-dialog-session-list-button:focus:active {
 +      background-color: #4a525b;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454545; }
 +  .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4c4c4c; }
 +  .login-dialog-button.cancel-button:outlined, .login-dialog-button.switch-user-button:outlined, .login-dialog-button.login-dialog-session-list-button:outlined, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #545454; }
 +    .login-dialog-button.cancel-button:outlined:hover, .login-dialog-button.switch-user-button:outlined:hover, .login-dialog-button.login-dialog-session-list-button:outlined:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
 +      background-color: #5c5c5c; }
 +    .login-dialog-button.cancel-button:outlined:active, .login-dialog-button.switch-user-button:outlined:active, .login-dialog-button.login-dialog-session-list-button:outlined:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
 +      background-color: #636363; }
 +
 +/* WIDGETS */
 +.shell-link {
 +  color: #8fbbf0; }
 +  .shell-link:hover {
 +    color: #bcd6f6; }
 +
 +.lowres-icon {
 +  icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); }
 +
 +.icon-dropshadow {
 +  icon-shadow: 0 1px 5px rgba(0, 0, 0, 0.8); }
 +
 +/* Entries */
 +StEntry StIcon.capslock-warning {
 +  icon-size: 1.09em;
 +  warning-color: #f6d32d;
 +  padding: 0 4px; }
 +
 +StEntry StIcon.peek-password {
 +  icon-size: 1.09em;
 +  padding: 0 4px; }
 +
 +StEntry StLabel.hint-text {
 +  margin-left: 2px; }
 +
 +/* Buttons */
 +.button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  min-height: 22px; }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  border-radius: 99px;
 +  padding: 12px;
 +  min-height: 16px; }
 +  .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .background-app-item .close-button StIcon {
 +    icon-size: 1.09em;
 +    -st-icon-style: symbolic; }
 +
 +/* Check Boxes */
 +.check-box StBoxLayout {
 +  spacing: .8em; }
 +
 +.check-box StBin {
 +  width: 24px;
 +  height: 24px;
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-off.svg"); }
 +
 +.check-box:focus StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused.svg"); }
 +
 +.check-box:checked StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
 +
 +.check-box:focus:checked StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
 +
 +/* Switches */
 +.toggle-switch {
 +  color: #ffffff;
 +  height: 26px;
 +  width: 48px;
 +  background-size: contain;
 +  background-image: url("resource:///org/gnome/shell/theme/toggle-off.svg"); }
 +  .toggle-switch:checked {
 +    background-image: url("resource:///org/gnome/shell/theme/toggle-on.svg"); }
 +
 +/* Slider */
 +.slider {
 +  -barlevel-height: 4px;
 +  -barlevel-background-color: rgba(255, 255, 255, 0.2);
 +  -barlevel-border-width: 2px;
 +  -barlevel-border-color: transparent;
 +  -barlevel-active-background-color: #3584e4;
 +  -barlevel-active-border-color: transparent;
 +  -barlevel-overdrive-color: #c01c28;
 +  -barlevel-overdrive-border-color: transparent;
 +  -barlevel-overdrive-separator-width: 1px;
 +  -slider-handle-radius: 8px;
 +  -slider-handle-border-width: 0;
 +  -slider-handle-border-color: transparent; }
 +
 +/* Scrollbars */
 +StScrollView.vfade {
 +  -st-vfade-offset: 68px; }
 +
 +StScrollView.hfade {
 +  -st-hfade-offset: 68px; }
 +
 +StScrollBar {
 +  padding: 0; }
 +  StScrollView StScrollBar {
 +    min-width: 8px;
 +    min-height: 8px; }
 +  StScrollBar StBin#trough {
 +    border-radius: 0;
 +    background-color: transparent; }
 +  StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
 +    border-radius: 8px;
 +    background-color: #5e5e5e;
 +    border: 3px solid transparent;
 +    transition: 500ms all ease; }
 +    StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
 +      background-color: #8c8c8c; }
 +    StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
 +      background-color: #757575; }
 +
 +/* Popovers/Menus */
 +.popup-menu-boxpointer, .candidate-popup-boxpointer {
 +  -arrow-rise: 6px; }
 +
 +.popup-menu {
 +  min-width: 15em;
 +  color: #ffffff; }
 +  .popup-menu.panel-menu {
 +    margin-bottom: 1.75em; }
 +
 +.popup-menu-content, .candidate-popup-content {
 +  padding: 6px;
 +  background-color: #1a1a1a;
 +  border-radius: 20px;
 +  border: 1px solid rgba(255, 255, 255, 0.3);
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0); }
 +
 +.popup-menu-item {
 +  font-weight: normal;
 +  spacing: 6px;
 +  transition-duration: 100ms;
 +  padding: 9px 12px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  border-radius: 12px; }
 +  .popup-menu-item:insensitive {
-   .popup-sub-menu .popup-menu-ornament {
-     icon-size: 1.09em !important;
-     width: 1.09em; }
++    background-color: transparent; }
 +  .popup-menu-item:focus, .popup-menu-item:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #5a5a5a; }
 +  .popup-menu-item:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #616161; }
 +  .popup-menu-item:checked {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: dimgray; }
 +    .popup-menu-item:checked:hover {
 +      background-color: #717171; }
 +    .popup-menu-item:checked:active {
 +      background-color: #787878; }
 +  .popup-menu-item:checked {
 +    border-radius: 12px 12px 0 0 !important;
 +    border: 1px solid rgba(255, 255, 255, 0.3);
 +    border-bottom-width: 0; }
 +  .popup-menu-item .toggle-switch:ltr {
 +    margin-left: 4px; }
 +  .popup-menu-item .toggle-switch:rtl {
 +    margin-right: 4px; }
 +
++.popup-ornamented-menu-item:ltr {
++  padding-left: 6px; }
++
++.popup-ornamented-menu-item:rtl {
++  padding-right: 6px; }
++
 +.popup-inactive-menu-item {
 +  color: #ffffff; }
 +  .popup-inactive-menu-item:insensitive {
 +    color: #8c8c8c; }
 +
 +.popup-menu-arrow,
 +.popup-menu-icon {
 +  icon-size: 16px !important; }
 +
 +.popup-sub-menu {
 +  border-radius: 0 0 13px 13px;
 +  margin-bottom: 6px;
 +  border: 1px solid rgba(255, 255, 255, 0.3); }
-   .popup-separator-menu-item .popup-menu-ornament {
-     width: 0 !important; }
 +  .popup-sub-menu .popup-menu-item {
 +    border-radius: 0;
 +    font-weight: normal;
 +    spacing: 6px;
 +    transition-duration: 100ms;
 +    padding: 9px 12px;
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #606060;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
 +    border-top-width: 0; }
 +    .popup-sub-menu .popup-menu-item:focus, .popup-sub-menu .popup-menu-item:hover {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #686868; }
 +    .popup-sub-menu .popup-menu-item:active {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #6f6f6f; }
 +    .popup-sub-menu .popup-menu-item:checked {
 +      transition-duration: 100ms;
 +      color: #ffffff;
 +      background-color: #777777; }
 +      .popup-sub-menu .popup-menu-item:checked:hover {
 +        background-color: #7f7f7f; }
 +      .popup-sub-menu .popup-menu-item:checked:active {
 +        background-color: #868686; }
 +    .popup-sub-menu .popup-menu-item:last-child {
 +      border-radius: 0 0 12px 12px;
 +      border-bottom-width: 0; }
 +  .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
 +    border-radius: 0; }
 +  .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
 +    border-radius: 0 0 12px 12px; }
 +
 +.popup-menu-ornament {
 +  icon-size: 1.09em !important;
 +  width: 1.09em; }
 +
 +.popup-separator-menu-item {
 +  border: none !important; }
 +  .popup-separator-menu-item .popup-separator-menu-item-separator {
 +    height: 1px;
 +    background-color: rgba(255, 255, 255, 0.3); }
-   .app-menu .popup-menu-ornament {
-     width: 0 !important; }
 +  .popup-sub-menu .popup-separator-menu-item {
 +    background-color: transparent; }
 +    .popup-sub-menu .popup-separator-menu-item:ltr {
 +      margin-right: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item:rtl {
 +      margin-left: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
 +      background-color: rgba(255, 255, 255, 0.3); }
 +
 +.background-menu {
 +  -boxpointer-gap: 0px;
 +  -arrow-rise: 0px; }
 +
 +.app-menu {
 +  max-width: 27.25em; }
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
 +    margin-right: 8px; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
 +    margin-left: 8px; }
 +
 +/* Date/Time Menu */
 +#calendarArea {
 +  padding: 4px; }
 +
 +.datemenu-calendar-column {
 +  spacing: 6px; }
 +  .datemenu-calendar-column:ltr {
 +    padding-left: 6px; }
 +  .datemenu-calendar-column:rtl {
 +    padding-right: 6px; }
 +  .datemenu-calendar-column .datemenu-displays-box {
 +    spacing: 6px; }
 +
 +/* today button (the date) */
 +.datemenu-today-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  padding: 9px; }
 +  .datemenu-today-button:insensitive {
-     transition-duration: 100ms;
-     color: rgba(255, 255, 255, 0.5);
-     background-color: rgba(255, 255, 255, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++    background-color: transparent; }
 +  .datemenu-today-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .datemenu-today-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .datemenu-today-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .datemenu-today-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .datemenu-today-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .datemenu-today-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05);
 +    background-color: transparent; }
 +
 +/* Calendar */
 +.calendar {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  margin-top: 0; }
 +  .calendar:insensitive {
-   border-radius: 12px;
++    background-color: transparent; }
 +  .calendar:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .calendar:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .calendar:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .calendar:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .calendar:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .calendar:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05);
 +    background-color: transparent; }
 +  .calendar .calendar-month-header .calendar-change-month-back StIcon,
 +  .calendar .calendar-month-header .calendar-change-month-forward StIcon {
 +    icon-size: 1.09em; }
 +  .calendar .calendar-month-header .calendar-month-label {
 +    padding: 8px 0; }
 +  .calendar .calendar-month-header .pager-button {
 +    padding: 0 !important;
 +    height: 32px;
 +    width: 32px;
 +    margin: 2px;
 +    border-radius: 8px;
 +    transition-duration: 100ms; }
 +  .calendar .calendar-day {
 +    border-radius: 99px;
 +    height: 3em !important;
 +    width: 3em !important;
 +    margin: 2px;
 +    padding: 0 !important;
 +    font-weight: 600;
 +    text-align: center;
 +    transition-duration: 100ms; }
 +    .calendar .calendar-day.calendar-day-heading {
 +      background-color: transparent;
 +      color: #8c8c8c;
 +      height: 0.93em !important;
 +      padding-top: 6px !important;
 +      margin-bottom: 0;
 +      border-radius: 9px; }
 +    .calendar .calendar-day.calendar-weekend {
 +      color: #8c8c8c; }
 +    .calendar .calendar-day.calendar-other-month {
 +      color: rgba(140, 140, 140, 0.3) !important;
 +      font-weight: normal; }
 +    .calendar .calendar-day.calendar-day-with-events {
 +      background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
 +      background-size: contain; }
 +  .calendar .calendar-week-number {
 +    font-size: 7pt;
 +    font-weight: bold;
 +    font-feature-settings: "tnum";
 +    text-align: center;
 +    margin: 6px;
 +    padding: 0 6px;
 +    border-radius: 3px;
 +    background-color: rgba(255, 255, 255, 0.1);
 +    color: #8c8c8c;
 +    border: 1px solid rgba(255, 255, 255, 0.3); }
 +
 +/* Events */
 +.events-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
 +  padding: 12px; }
 +  .events-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .events-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .events-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .events-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .events-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .events-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .events-button .events-box {
 +    spacing: 6px; }
 +  .events-button .events-list {
 +    spacing: 12px;
 +    color: #ffffff; }
 +  .events-button .events-title {
 +    margin-bottom: 4px; }
 +  .events-button .event-time {
 +    color: #8c8c8c; }
 +
 +/* World clocks */
 +.world-clocks-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
 +  padding: 12px; }
 +  .world-clocks-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .world-clocks-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .world-clocks-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .world-clocks-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .world-clocks-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .world-clocks-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .world-clocks-button .world-clocks-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +  .world-clocks-button .world-clocks-header {
 +    color: #8c8c8c; }
 +  .world-clocks-button .world-clocks-city {
 +    color: #ffffff; }
 +  .world-clocks-button .world-clocks-time {
 +    color: #ffffff; }
 +    .world-clocks-button .world-clocks-time:ltr {
 +      text-align: right; }
 +    .world-clocks-button .world-clocks-time:rtl {
 +      text-align: left; }
 +  .world-clocks-button .world-clocks-timezone {
 +    color: #8c8c8c; }
 +
 +/* Weather */
 +.weather-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
 +  padding: 12px; }
 +  .weather-button:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .weather-button:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .weather-button:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .weather-button:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .weather-button:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .weather-button:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .weather-button .weather-box {
 +    spacing: 10px; }
 +  .weather-button .weather-header-box {
 +    spacing: 6px; }
 +  .weather-button .weather-header {
 +    color: #8c8c8c; }
 +    .weather-button .weather-header.location {
 +      font-weight: normal; }
 +  .weather-button .weather-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +  .weather-button .weather-forecast-time {
 +    color: #b3b3b3;
 +    padding-top: 0.2em;
 +    padding-bottom: 0.4em; }
 +  .weather-button .weather-forecast-icon {
 +    icon-size: 2.18em; }
 +
 +/* Message List */
 +.message-list {
 +  width: 29em;
 +  border: solid rgba(255, 255, 255, 0.3); }
 +  .message-list:ltr {
 +    margin-left: 0;
 +    margin-right: 4px;
 +    padding-right: 6px;
 +    border-right-width: 1px; }
 +  .message-list:rtl {
 +    margin-right: 0;
 +    margin-left: 4px;
 +    padding-left: 6px;
 +    border-left-width: 1px; }
 +  .message-list .message-list-placeholder {
 +    color: #8c8c8c; }
 +    .message-list .message-list-placeholder > StIcon {
 +      icon-size: 3.27em;
 +      margin-bottom: 12px;
 +      -st-icon-style: symbolic; }
 +
 +.message-list-sections {
 +  spacing: 6px;
 +  margin: 0;
 +  padding-bottom: 6px; }
 +  .message-list-sections:ltr {
 +    margin-right: 12px; }
 +  .message-list-sections:rtl {
 +    margin-left: 12px; }
 +
 +.message-list-section,
 +.message-list-section-list {
 +  spacing: 6px; }
 +
 +.message-list-controls {
 +  padding: 6px;
 +  spacing: 6px; }
 +  .message-list-controls .dnd-button {
 +    border-width: 2px;
 +    border-color: transparent;
 +    border-radius: 32px;
 +    border-style: solid; }
 +    .message-list-controls .dnd-button:focus {
 +      border-color: rgba(53, 132, 228, 0.6); }
 +
 +.message {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .message:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .message:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .message:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .message:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .message:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .message:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .message .message-icon-bin {
 +    padding: 18px; }
 +    .message .message-icon-bin:ltr {
 +      padding-right: 6px; }
 +    .message .message-icon-bin:rtl {
 +      padding-left: 6px; }
 +    .message .message-icon-bin > StIcon {
 +      icon-size: 2.18em;
 +      -st-icon-style: symbolic; }
 +    .message .message-icon-bin > .fallback-app-icon {
 +      width: 1.09em;
 +      height: 1.09em; }
 +  .message .message-content {
 +    spacing: 4px;
 +    padding: 9px;
 +    margin-bottom: 8px; }
 +  .message .message-title {
 +    font-weight: bold;
 +    /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
 +    padding-top: 0.57em; }
 +  .message .message-secondary-bin {
 +    padding: 0 8px; }
 +    .message .message-secondary-bin > .event-time {
 +      color: rgba(255, 255, 255, 0.5);
 +      font-size: 9pt;
 +      /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
 +      padding-bottom: 0.13em; }
 +      .message .message-secondary-bin > .event-time:ltr {
 +        text-align: right; }
 +      .message .message-secondary-bin > .event-time:rtl {
 +        text-align: left; }
 +  .message .message-close-button {
 +    color: #ffffff;
 +    background-color: rgba(255, 255, 255, 0.2);
 +    border-radius: 99px;
 +    padding: 5px;
 +    margin: 1px; }
 +    .message .message-close-button:hover {
 +      background-color: rgba(255, 255, 255, 0.3); }
 +    .message .message-close-button:active {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +    .message .message-close-button > StIcon {
 +      icon-size: 1.09em; }
 +  .message .message-body {
 +    color: #e6e6e6; }
 +
 +.url-highlighter {
 +  link-color: #8fbbf0; }
 +
 +/* Media Controls */
 +.message-media-control {
 +  padding: 0 18px;
 +  margin: 12px 0;
 +  border-radius: 8px;
 +  color: #ffffff;
 +  border: 1px solid rgba(255, 255, 255, 0.3);
 +  margin: 12px 2px; }
 +  .message-media-control:hover {
 +    background-color: #595959;
 +    color: #ffffff; }
 +  .message-media-control:active {
 +    background-color: #5e5e5e;
 +    color: #ffffff; }
 +  .message-media-control:insensitive {
 +    color: #999999;
 +    border-color: transparent; }
 +  .message-media-control:last-child:ltr {
 +    margin-right: 12px; }
 +  .message-media-control:last-child:rtl {
 +    margin-left: 12px; }
 +  .message-media-control StIcon {
 +    icon-size: 1.09em; }
 +
 +.media-message-cover-icon {
 +  icon-size: 3.27em !important;
 +  border-radius: 8px; }
 +  .media-message-cover-icon.fallback {
 +    color: #d4d4d4;
 +    background-color: #1a1a1a;
 +    border: 1px solid transparent;
 +    border-radius: 8px;
 +    icon-size: 2.18em !important;
 +    padding: 14px; }
 +
 +.candidate-popup-content {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +.candidate-index {
 +  padding: 0;
 +  padding-right: 6px;
 +  color: #8c8c8c; }
 +
 +.candidate-box {
 +  padding: 6px 12px 6px 12px;
 +  border-radius: 8px; }
 +  .candidate-box:selected {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +  .candidate-box:hover {
 +    background-color: #4d4d4d;
 +    color: white; }
 +
 +.candidate-page-button-box {
 +  height: 2em; }
 +  .vertical .candidate-page-button-box {
 +    padding-top: 12px; }
 +  .horizontal .candidate-page-button-box {
 +    padding-left: 12px; }
 +
 +.candidate-page-button {
 +  padding: 6px; }
 +  .candidate-page-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.candidate-page-button-previous {
 +  border-radius: 8px 0px 0px 8px;
 +  border-right-width: 0;
 +  box-shadow: none; }
 +
 +.candidate-page-button-next {
 +  border-radius: 0px 8px 8px 0px;
 +  box-shadow: none; }
 +
 +/* Notifications & Message Tray */
 +.notification-banner {
 +  min-height: 64px;
 +  width: 34em;
 +  box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0);
-   background-color: #0d0d0d;
++  border-radius: 16px;
 +  margin: 4px; }
 +  .notification-banner .notification-actions {
 +    spacing: 0; }
 +
 +.summary-source-counter {
 +  font-size: 10pt;
 +  font-weight: bold;
 +  height: 1.6em;
 +  width: 1.6em;
 +  -shell-counter-overlap-x: 3px;
 +  -shell-counter-overlap-y: 3px;
 +  background-color: #3584e4;
 +  color: #ffffff;
 +  border: 2px solid #ffffff;
 +  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
 +  border-radius: 0.9em; }
 +
 +.chat-body {
 +  spacing: 5px; }
 +
 +.chat-response {
 +  margin: 5px; }
 +
 +.chat-log-message {
 +  color: #e6e6e6; }
 +
 +.chat-new-group {
 +  padding-top: 1em; }
 +
 +.chat-received {
 +  padding-left: 4px; }
 +  .chat-received:rtl {
 +    padding-left: 0px;
 +    padding-right: 4px; }
 +
 +.chat-sent {
 +  padding-left: 18pt;
 +  color: white; }
 +  .chat-sent:rtl {
 +    padding-left: 0;
 +    padding-right: 18pt; }
 +
 +.chat-meta-message {
 +  padding-left: 4px;
 +  font-size: 9pt;
 +  font-weight: bold;
 +  color: white; }
 +  .chat-meta-message:rtl {
 +    padding-left: 0;
 +    padding-right: 4px; }
 +
 +.hotplug-notification-item-icon {
 +  icon-size: 24px;
 +  padding: 0 4px; }
 +
 +/* Modal Dialogs */
 +.modal-dialog {
 +  background-color: #1a1a1a;
 +  border-radius: 16px;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .modal-dialog .modal-dialog-content-box {
 +    margin: 32px 40px;
 +    spacing: 32px;
 +    max-width: 28em; }
 +
 +/* End Session Dialog */
 +.end-session-dialog {
 +  width: 30em; }
 +  .end-session-dialog .end-session-dialog-battery-warning,
 +  .end-session-dialog .dialog-list-title {
 +    color: #f6d32d; }
 +
 +/* Message Dialog */
 +.message-dialog-content {
 +  spacing: 18px; }
 +  .message-dialog-content .message-dialog-title {
 +    text-align: center; }
 +  .message-dialog-content .message-dialog-description {
 +    text-align: center; }
 +
 +/* Dialog List */
 +.dialog-list {
 +  spacing: 18px; }
 +  .dialog-list .dialog-list-title {
 +    text-align: center; }
 +  .dialog-list .dialog-list-scrollview {
 +    max-height: 200px; }
 +  .dialog-list .dialog-list-box {
 +    spacing: 1em; }
 +    .dialog-list .dialog-list-box .dialog-list-item {
 +      spacing: 1em; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
 +        font-weight: bold; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
 +        color: #f2f2f2; }
 +
 +/* Run Dialog */
 +.run-dialog .modal-dialog-content-box {
 +  margin-top: 24px;
 +  margin-bottom: 14px; }
 +
 +.run-dialog .run-dialog-entry {
 +  width: 20em; }
 +
 +.run-dialog .run-dialog-description {
 +  text-align: center;
 +  color: #cccccc; }
 +
 +/* Password or Authentication Dialog */
 +.prompt-dialog {
 +  width: 28em; }
 +  .prompt-dialog .modal-dialog-content-box {
 +    margin-bottom: 24px; }
 +
 +.prompt-dialog-password-grid {
 +  spacing-rows: 8px;
 +  spacing-columns: 4px; }
 +  .prompt-dialog-password-grid .prompt-dialog-password-entry {
 +    width: auto; }
 +    .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
 +      margin-left: 20px; }
 +    .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
 +      margin-right: 20px; }
 +
 +.prompt-dialog-password-layout {
 +  spacing: 8px; }
 +
 +.prompt-dialog-password-entry {
 +  width: 20em; }
 +
 +.prompt-dialog-error-label,
 +.prompt-dialog-info-label,
 +.prompt-dialog-null-label {
 +  text-align: center; }
 +
 +.prompt-dialog-error-label {
 +  color: #f6d32d; }
 +
 +/* Polkit Dialog */
 +.polkit-dialog-user-layout {
 +  text-align: center;
 +  spacing: 8px;
 +  margin-bottom: 6px; }
 +  .polkit-dialog-user-layout .polkit-dialog-user-root-label {
 +    color: #f6d32d; }
 +
 +/* Audio selection dialog */
 +.audio-device-selection-dialog .modal-dialog-content-box {
 +  margin-bottom: 28px; }
 +
 +.audio-device-selection-dialog .audio-selection-box {
 +  spacing: 20px; }
 +
 +.audio-selection-device {
 +  border-radius: 16px; }
 +  .audio-selection-device:hover, .audio-selection-device:focus {
 +    background-color: #4d4d4d; }
 +  .audio-selection-device:active {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +
 +.audio-selection-device-box {
 +  padding: 20px;
 +  spacing: 20px; }
 +
 +.audio-selection-device-icon {
 +  icon-size: 4.36em; }
 +
 +/* Welcome dialog */
 +.welcome-dialog-image {
 +  background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
 +  background-size: contain;
 +  /* Reasonable maximum dimensions */
 +  height: 300px;
 +  width: 300px; }
 +
 +/* Access portal dialog */
 +.access-dialog {
 +  text-align: center; }
 +
 +/* OSD */
 +.osd-window {
 +  text-align: center;
 +  font-weight: bold;
 +  spacing: 12px;
 +  padding: 12px 18px;
 +  margin-bottom: 4em; }
 +  .osd-window > * {
 +    spacing: 8px; }
 +  .osd-window StIcon {
 +    icon-size: 2.18em; }
 +  .osd-window StLabel:ltr {
 +    margin-right: 6px; }
 +  .osd-window StLabel:rtl {
 +    margin-left: 6px; }
 +  .osd-window .level {
 +    margin-bottom: 4px;
 +    height: 6px;
 +    min-width: 10.9em;
 +    -barlevel-height: 6px;
 +    -barlevel-background-color: rgba(255, 255, 255, 0.1);
 +    -barlevel-active-background-color: #ffffff;
 +    -barlevel-overdrive-color: #c01c28;
 +    -barlevel-overdrive-separator-width: 3px; }
 +    .osd-window .level:first-child {
 +      margin-bottom: 0px; }
 +    .osd-window .level:ltr {
 +      margin-right: 6px; }
 +    .osd-window .level:rtl {
 +      margin-left: 6px; }
 +
 +.osd-monitor-label {
 +  border-radius: 16px;
 +  font-size: 3em;
 +  font-weight: bold;
 +  margin: 12px;
 +  text-align: center;
 +  min-width: 1.3em; }
 +
 +/* Pad OSD */
 +.pad-osd-window {
 +  padding: 32px;
 +  background-color: rgba(0, 0, 0, 0.8); }
 +  .pad-osd-window .pad-osd-title-box {
 +    spacing: 12px; }
 +  .pad-osd-window .pad-osd-title-menu-box {
 +    spacing: 6px; }
 +
 +.combo-box-label {
 +  width: 15em; }
 +
 +/* App Switcher */
 +.switcher-popup {
 +  padding: 0;
 +  spacing: 24px; }
 +
 +.switcher-list {
 +  padding: 12px;
 +  border-radius: 28px;
 +  box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0); }
 +  .switcher-list .switcher-list-item-container {
 +    spacing: 12px; }
 +  .switcher-list .item-box {
 +    background-color: transparent;
 +    box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.1); }
 +    .switcher-list .item-box:hover {
 +      background-color: rgba(255, 255, 255, 0.1); }
 +    .switcher-list .item-box:selected, .switcher-list .item-box:focus {
 +      background-color: rgba(255, 255, 255, 0.13); }
 +      .switcher-list .item-box:selected:hover, .switcher-list .item-box:focus:hover {
 +        background-color: rgba(255, 255, 255, 0.16); }
 +      .switcher-list .item-box:selected:active, .switcher-list .item-box:focus:active {
 +        background-color: rgba(255, 255, 255, 0.13); }
 +    .switcher-list .item-box:active {
 +      background-color: rgba(255, 255, 255, 0.16); }
 +    .switcher-list .item-box:outlined, .switcher-list .item-box:checked {
 +      background-color: rgba(255, 255, 255, 0.19); }
 +      .switcher-list .item-box:outlined:active, .switcher-list .item-box:checked:active {
 +        background-color: rgba(255, 255, 255, 0.22); }
 +      .switcher-list .item-box:outlined:hover, .switcher-list .item-box:checked:hover {
 +        background-color: rgba(255, 255, 255, 0.25); }
 +    .switcher-list .item-box:drop {
 +      border: 2px solid rgba(53, 132, 228, 0.8);
 +      background-color: rgba(53, 132, 228, 0.2); }
 +    .switcher-list .item-box:hover {
 +      background: none; }
 +  .switcher-list .separator {
 +    width: 1px;
 +    background: rgba(255, 255, 255, 0.3); }
 +  .switcher-list .thumbnail-box {
 +    padding: 2px;
 +    spacing: 6px; }
 +  .switcher-list .thumbnail {
 +    width: 256px;
 +    border-radius: 8px; }
 +
 +.switcher-arrow {
 +  border-color: rgba(255, 255, 255, 0.8);
 +  color: rgba(255, 255, 255, 0.8); }
 +  .switcher-arrow:highlighted {
 +    border-color: #ffffff;
 +    color: #ffffff; }
 +
 +.input-source-switcher-symbol {
 +  font-size: 34pt;
 +  width: 96px;
 +  height: 96px; }
 +
 +.cycler-highlight {
 +  border: 5px solid #3584e4; }
 +
 +/* Workspace Switcher */
 +.workspace-switcher {
 +  margin-bottom: 4em;
 +  spacing: 12px;
 +  padding: 12px 18px; }
 +
 +.ws-switcher-indicator {
 +  background-color: rgba(255, 255, 255, 0.5);
 +  padding: 0.1816666667em;
 +  margin: 0.9083333333em;
 +  border-radius: 2.18em; }
 +  .ws-switcher-indicator:active {
 +    background-color: #ffffff;
 +    padding: 0.3633333333em;
 +    margin: 0.7266666667em; }
 +
 +.icon-label-button-container {
 +  spacing: 6px; }
 +  .icon-label-button-container StIcon {
 +    icon-size: 32px; }
 +
 +.screenshot-ui-panel {
 +  border-radius: 37px;
 +  padding: 18px;
 +  padding-bottom: 12px;
 +  margin-bottom: 4em;
 +  spacing: 12px; }
 +
 +.screenshot-ui-close-button {
 +  padding: 6px !important;
 +  margin-top: 12px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0); }
 +  .screenshot-ui-close-button.left {
 +    margin-left: 12px; }
 +  .screenshot-ui-close-button.right {
 +    margin-right: 12px; }
 +
 +.screenshot-ui-type-button {
 +  min-width: 48px;
 +  padding: 12px 18px !important;
 +  border-radius: 19px; }
 +
 +.screenshot-ui-capture-button {
 +  width: 36px;
 +  height: 36px;
 +  border-radius: 99px;
 +  border: 4px #ffffff;
 +  padding: 4px; }
 +  .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
 +    background-color: #ffffff;
 +    transition-duration: 200ms;
 +    border-radius: 99px; }
 +    .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
 +      background-color: #4d4d4d; }
 +  .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d9d9d9; }
 +  .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
 +    background-color: gray; }
 +  .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
 +    background-color: #c01c28; }
 +  .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d61f2d; }
 +  .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
 +    background-color: #a11722; }
 +
 +.screenshot-ui-shot-cast-container {
-     background-color: #1a1a1a; }
++  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 16px;
 +  padding: 3px;
 +  spacing: 3px; }
 +  .screenshot-ui-shot-cast-container:ltr {
 +    margin-left: 3px; }
 +  .screenshot-ui-shot-cast-container:rtl {
 +    margin-right: 3px; }
 +
 +.screenshot-ui-shot-cast-button {
 +  padding: 6px 12px;
 +  background-color: transparent;
 +  border-radius: 13px; }
 +  .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
-     background-color: #5e5e5e; }
++    background-color: rgba(255, 255, 255, 0.2); }
 +  .screenshot-ui-shot-cast-button:active {
-     background-color: white;
-     color: black; }
++    background-color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button:checked {
-   #panel.unlock-screen, #panel.login-screen, #panel:overview {
-     background-color: transparent;
-     box-shadow: none; }
-     #panel.unlock-screen .panel-button, #panel.login-screen .panel-button, #panel:overview .panel-button {
-       transition-duration: 150ms;
-       border: 3px solid transparent;
-       border-radius: 99px;
-       font-weight: bold;
-       background-color: transparent;
-       color: #f2f2f2;
-       box-shadow: none; }
-       #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:overview, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:overview, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:active, #panel:overview .panel-button:overview, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
-         box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.25); }
-         #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:overview:hover, #panel.unlock-screen .panel-button:focus:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:overview:hover, #panel.login-screen .panel-button:focus:hover, #panel.login-screen .panel-button:checked:hover, #panel:overview .panel-button:active:hover, #panel:overview .panel-button:overview:hover, #panel:overview .panel-button:focus:hover, #panel:overview .panel-button:checked:hover {
-           box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.35); }
-       #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:hover, #panel:overview .panel-button:hover {
-         box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
++    background-color: #ffffff;
++    color: #000000; }
 +  .screenshot-ui-shot-cast-button:insensitive {
 +    color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.screenshot-ui-show-pointer-button {
 +  border-radius: 99px;
 +  padding: 12px !important; }
 +  .screenshot-ui-show-pointer-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.3); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.5); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
 +  border: 2px white; }
 +
 +.screenshot-ui-area-selector-handle {
 +  border-radius: 99px;
 +  background-color: white;
 +  box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0);
 +  width: 24px;
 +  height: 24px; }
 +
 +.screenshot-ui-window-selector {
 +  background-color: #0d0d0d; }
 +  .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
 +    margin: 100px; }
 +  .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
 +    margin-bottom: 200px; }
 +
 +.screenshot-ui-window-selector-window-border {
 +  transition-duration: 200ms;
 +  border-radius: 16px;
 +  border: 6px transparent; }
 +
 +.screenshot-ui-window-selector-check {
 +  transition-duration: 200ms;
 +  color: transparent;
 +  border-radius: 99px;
 +  border-width: 12px;
 +  icon-size: 24px; }
 +
 +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
 +  border-color: #185fb4; }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
 +  border-color: #3584e4;
 +  background-color: rgba(53, 132, 228, 0.2); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
 +  color: #ffffff;
 +  background-color: #3584e4; }
 +
 +.screenshot-ui-screen-selector {
 +  transition-duration: 200ms;
 +  background-color: rgba(0, 0, 0, 0.5); }
 +  .screenshot-ui-screen-selector:hover {
 +    background-color: rgba(0, 0, 0, 0.3); }
 +  .screenshot-ui-screen-selector:active {
 +    background-color: rgba(0, 0, 0, 0.7); }
 +  .screenshot-ui-screen-selector:checked {
 +    background-color: transparent;
 +    border: 2px white; }
 +
 +.screenshot-ui-tooltip {
 +  text-align: center;
 +  -y-offset: 24px; }
 +
 +/* Top Bar */
 +#panel {
 +  background-color: #000000;
 +  font-weight: bold;
 +  height: 2.2em;
 +  transition-duration: 250ms;
 +  box-shadow: inset 0 -1px 0 0 #000000; }
-     #panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
 +  #panel .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    border-radius: 99px;
 +    font-weight: bold;
 +    background-color: transparent;
 +    color: #f2f2f2;
 +    box-shadow: none;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 6px; }
-       #panel .panel-button:active:hover, #panel .panel-button:overview:hover, #panel .panel-button:focus:hover, #panel .panel-button:checked:hover {
++    #panel .panel-button:active, #panel .panel-button:focus, #panel .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.25); }
-       #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:overview, #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:checked {
++      #panel .panel-button:active:hover, #panel .panel-button:focus:hover, #panel .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35); }
 +    #panel .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.2); }
 +    #panel .panel-button .system-status-icon {
 +      icon-size: 1.09em;
 +      padding: 5px;
 +      margin: 0 4px; }
 +    #panel .panel-button .panel-status-indicators-box .system-status-icon,
 +    #panel .panel-button .panel-status-menu-box .system-status-icon {
 +      margin: 0; }
 +    #panel .panel-button .app-menu-icon {
 +      -st-icon-style: symbolic; }
 +    #panel #panelActivities.panel-button {
 +      -natural-hpadding: 18px; }
 +    #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
 +      spacing: 6px; }
 +    #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
 +      icon-size: 1.09em; }
 +    #panel .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
 +      color: #f2f2f2;
 +      box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.8); }
-         #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:overview:hover, #panel .panel-button.screen-recording-indicator:focus:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
++      #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #c01c28; }
-       color: rgba(0, 0, 0, 0.8);
-       box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.8); }
-       #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:overview, #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:checked {
-         box-shadow: inset 0 0 0 100px #f6d32d; }
-         #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:overview:hover, #panel .panel-button.screen-sharing-indicator:focus:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
-           box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.95); }
++        #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:focus:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.95); }
 +      #panel .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.9); }
 +    #panel .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
-         box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.9); }
++      color: #f2f2f2;
++      box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.8); }
++      #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:checked {
++        box-shadow: inset 0 0 0 100px #ff7800; }
++        #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:focus:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
++          box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.95); }
 +      #panel .panel-button.screen-sharing-indicator:hover {
-       #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
++        box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.9); }
 +    #panel .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
 +      color: #f2f2f2;
 +      box-shadow: none;
 +      box-shadow: none !important; }
-         #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:overview:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
++      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.25); }
-       #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
++        #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35); }
 +      #panel .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.2); }
 +      #panel .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 99px; }
-         #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:overview .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
++      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
 +        box-shadow: none !important; }
-         #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:overview:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
-           box-shadow: none !important; }
-           #panel .panel-button.clock-display:active:hover .clock, #panel .panel-button.clock-display:overview:hover .clock, #panel .panel-button.clock-display:focus:hover .clock, #panel .panel-button.clock-display:checked:hover .clock {
-             box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35); }
++        #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
 +          box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.25); }
-   #panel .screencast-indicator,
-   #panel .remote-access-indicator {
-     color: #f6d32d; }
++          #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:focus .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
++            box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.35) !important; }
 +      #panel .panel-button.clock-display:hover {
 +        box-shadow: none !important; }
 +        #panel .panel-button.clock-display:hover .clock {
 +          box-shadow: inset 0 0 0 100px rgba(242, 242, 242, 0.2); }
++  #panel.unlock-screen, #panel.login-screen, #panel:overview {
++    background-color: transparent;
++    box-shadow: none; }
++    #panel.unlock-screen .panel-button, #panel.login-screen .panel-button, #panel:overview .panel-button {
++      transition-duration: 150ms;
++      border: 3px solid transparent;
++      border-radius: 99px;
++      font-weight: bold;
++      background-color: transparent;
++      color: #ffffff;
++      box-shadow: none; }
++      #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:active, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
++        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.25); }
++        #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:focus:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:focus:hover, #panel.login-screen .panel-button:checked:hover, #panel:overview .panel-button:active:hover, #panel:overview .panel-button:focus:hover, #panel:overview .panel-button:checked:hover {
++          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.35); }
++      #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:hover, #panel:overview .panel-button:hover {
++        box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
++      #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display, #panel:overview .panel-button.clock-display {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: #ffffff;
++        box-shadow: none;
++        box-shadow: none !important; }
++        #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
++          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.25); }
++          #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:focus:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:focus:hover, #panel.login-screen .panel-button.clock-display:checked:hover, #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:focus:hover, #panel:overview .panel-button.clock-display:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.35); }
++        #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:hover {
++          box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
++        #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock, #panel:overview .panel-button.clock-display .clock {
++          transition-duration: 150ms;
++          border: 3px solid transparent;
++          border-radius: 99px; }
++        #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
++          box-shadow: none !important; }
++          #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:checked .clock, #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:checked .clock {
++            box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.25); }
++            #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:focus .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:focus .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover, #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:focus .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
++              box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.35) !important; }
++        #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:hover {
++          box-shadow: none !important; }
++          #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:hover .clock, #panel:overview .panel-button.clock-display:hover .clock {
++            box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.2); }
++      #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator, #panel:overview .panel-button.screen-recording-indicator {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: #f2f2f2;
++        box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.8); }
++        #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:checked, #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:checked {
++          box-shadow: inset 0 0 0 100px #c01c28; }
++          #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover, #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:focus:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.95); }
++        #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:hover, #panel:overview .panel-button.screen-recording-indicator:hover {
++          box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.9); }
++      #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator, #panel:overview .panel-button.screen-sharing-indicator {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: rgba(0, 0, 0, 0.8);
++        box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.8); }
++        #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:checked, #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:checked {
++          box-shadow: inset 0 0 0 100px #f6d32d; }
++          #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover, #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:focus:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.95); }
++        #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:hover, #panel:overview .panel-button.screen-sharing-indicator:hover {
++          box-shadow: inset 0 0 0 100px rgba(246, 211, 45, 0.9); }
 +  #panel .panel-status-indicators-box,
 +  #panel .panel-status-menu-box {
 +    spacing: 2px; }
 +  #panel .power-status.panel-status-indicators-box {
 +    spacing: 0; }
-   border-width: 0; }
++  #panel .privacy-indicator {
++    color: #ff7800; }
 +
 +#appMenu {
 +  spacing: 6px; }
 +  #appMenu .label-shadow {
 +    color: transparent; }
 +
 +#appMenu .panel-status-menu-box {
 +  padding: 0 6px;
 +  spacing: 6px; }
 +
 +.clock-display-box {
 +  spacing: 2px; }
 +  .clock-display-box .clock {
 +    padding-left: 12px;
 +    padding-right: 12px; }
 +
 +/* Activities Ripple */
 +.ripple-box {
 +  background-color: rgba(255, 255, 255, 0.2);
 +  box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
 +  width: 52px;
 +  height: 52px;
 +  border-radius: 0 0 52px 0; }
 +  .ripple-box:rtl {
 +    border-radius: 0 0 0 52px; }
 +
 +.quick-settings {
 +  padding: 18px;
 +  border-radius: 36px; }
 +  .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .background-app-item .close-button, .background-app-item .quick-settings .close-button, .quick-settings .button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .calendar .calendar-day, .calendar .quick-settings .calendar-day {
 +    padding: 10.5px; }
 +
 +.quick-settings-grid {
 +  spacing-rows: 12px;
 +  spacing-columns: 12px; }
 +
 +.quick-toggle, .quick-menu-toggle {
 +  border-radius: 99px;
 +  min-width: 12em;
 +  max-width: 12em;
 +  min-height: 48px;
 +  border: none; }
 +
 +.quick-toggle {
 +  /* Move padding into the box; this is to allow menu arrows
 +     to extend to the border */ }
 +  .quick-toggle:checked {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +    .quick-toggle:checked:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .quick-toggle:checked:hover, .quick-toggle:checked:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .quick-toggle:checked:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .quick-toggle:checked:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .quick-toggle > StBoxLayout {
 +    spacing: 9px; }
 +  .quick-toggle.button, .quick-toggle.icon-button, .quick-toggle.login-dialog-button.cancel-button, .quick-toggle.login-dialog-button.switch-user-button, .quick-toggle.login-dialog-button.login-dialog-session-list-button, .background-app-item .quick-toggle.close-button, .calendar .calendar-month-header .quick-toggle.pager-button, .calendar .quick-toggle.calendar-day {
 +    padding: 0; }
 +  .quick-toggle > StBoxLayout {
 +    padding: 0 12px; }
 +  .quick-toggle:ltr > StBoxLayout {
 +    padding-left: 15px; }
 +  .quick-toggle:rtl > StBoxLayout {
 +    padding-right: 15px; }
 +  .quick-toggle .quick-toggle-title {
 +    font-weight: bold; }
 +  .quick-toggle StBoxLayout > .quick-toggle-subtitle {
 +    font-weight: normal;
 +    font-size: 12px; }
 +  .quick-toggle .quick-toggle-icon {
 +    icon-size: 1.09em; }
 +
 +.quick-menu-toggle .quick-toggle {
 +  min-width: auto;
 +  max-width: auto; }
 +  .quick-menu-toggle .quick-toggle:ltr {
 +    border-radius: 99px 0 0 99px; }
 +  .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
 +    padding-right: 9px; }
 +  .quick-menu-toggle .quick-toggle:rtl {
 +    border-radius: 0 99px 99px 0; }
 +  .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
 +    padding-left: 9px; }
 +  .quick-menu-toggle .quick-toggle:ltr:last-child {
 +    border-radius: 99px; }
 +  .quick-menu-toggle .quick-toggle:rtl:last-child {
 +    border-radius: 99px; }
 +
 +.quick-menu-toggle .quick-toggle-arrow {
 +  padding: 6px 10.5px;
-   background-color: #1a1a1a;
++  border-width: 0;
++  border-color: rgba(255, 255, 255, 0.25); }
 +  .quick-menu-toggle .quick-toggle-arrow:checked {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff;
 +    border-color: #15539e; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:hover, .quick-menu-toggle .quick-toggle-arrow:checked:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:insensitive {
 +      transition-duration: 100ms;
 +      color: rgba(255, 255, 255, 0.5);
 +      background-color: rgba(255, 255, 255, 0.05);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .quick-menu-toggle .quick-toggle-arrow:ltr {
 +    border-radius: 0 99px 99px 0;
 +    border-left-width: 1px; }
 +  .quick-menu-toggle .quick-toggle-arrow:rtl {
 +    border-radius: 99px 0 0 99px;
 +    border-right-width: 1px; }
 +
 +.quick-slider > StBoxLayout {
 +  spacing: 6px; }
 +
 +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .background-app-item .close-button, .background-app-item .quick-slider .close-button {
 +  padding: 6px; }
 +
 +.quick-slider .slider-bin {
 +  min-height: 16px;
 +  padding: 6px;
 +  border-radius: 99px; }
 +  .quick-slider .slider-bin:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .quick-slider .slider-bin:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .quick-slider .slider-bin:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +
 +.quick-toggle-menu {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
 +  background-color: #1a1a1a !important;
 +  color: #ffffff !important;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 12px 18px 0; }
 +  .quick-toggle-menu:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .quick-toggle-menu:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .quick-toggle-menu:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .quick-toggle-menu:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .quick-toggle-menu:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .quick-toggle-menu:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +  .quick-toggle-menu .popup-menu-item > StIcon {
 +    -st-icon-style: symbolic; }
 +  .quick-toggle-menu .header {
 +    spacing-rows: 3px;
 +    spacing-columns: 12px;
 +    padding-bottom: 12px; }
 +    .quick-toggle-menu .header .icon {
 +      icon-size: 1.635em;
 +      border-radius: 999px;
 +      padding: 9px;
 +      background-color: rgba(255, 255, 255, 0.2); }
 +      .quick-toggle-menu .header .icon.active {
 +        background-color: #3584e4;
 +        color: #ffffff; }
 +
 +.quick-settings-system-item > StBoxLayout {
 +  spacing: 12px; }
 +
 +.quick-settings-system-item .power-item {
 +  min-height: 0;
 +  min-width: 0; }
 +  .quick-settings-system-item .power-item:insensitive {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #474747;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
 +    background-color: transparent; }
 +
 +.nm-network-item .wireless-secure-icon {
 +  icon-size: 0.545em; }
 +
 +.bt-device-item .popup-menu-icon {
 +  -st-icon-style: symbolic; }
 +
 +.bt-menu-placeholder.popup-menu-item {
 +  text-align: center;
 +  padding: 2em 4em; }
 +
 +.device-subtitle {
 +  color: rgba(255, 255, 255, 0.5); }
 +
++.keyboard-brightness-item .slider {
++  min-height: 16px; }
++
++.keyboard-brightness-level {
++  spacing: 6px; }
++  .keyboard-brightness-level .button:checked, .keyboard-brightness-level .icon-button:checked, .keyboard-brightness-level .login-dialog-button.cancel-button:checked, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked, .keyboard-brightness-level .background-app-item .close-button:checked, .background-app-item .keyboard-brightness-level .close-button:checked, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked, .keyboard-brightness-level .calendar .calendar-day:checked, .calendar .keyboard-brightness-level .calendar-day:checked {
++    transition-duration: 100ms;
++    background-color: #3584e4;
++    color: #ffffff; }
++    .keyboard-brightness-level .button:checked:focus, .keyboard-brightness-level .icon-button:checked:focus, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:focus, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:focus, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:focus, .keyboard-brightness-level .background-app-item .close-button:checked:focus, .background-app-item .keyboard-brightness-level .close-button:checked:focus, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:focus, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:focus, .keyboard-brightness-level .calendar .calendar-day:checked:focus, .calendar .keyboard-brightness-level .calendar-day:checked:focus {
++      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
++    .keyboard-brightness-level .button:checked:hover, .keyboard-brightness-level .icon-button:checked:hover, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:hover, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:hover, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:hover, .keyboard-brightness-level .background-app-item .close-button:checked:hover, .background-app-item .keyboard-brightness-level .close-button:checked:hover, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:hover, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:hover, .keyboard-brightness-level .calendar .calendar-day:checked:hover, .calendar .keyboard-brightness-level .calendar-day:checked:hover, .keyboard-brightness-level .button:checked:focus, .keyboard-brightness-level .icon-button:checked:focus, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:focus, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:focus, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:focus, .keyboard-brightness-level .background-app-item .close-button:checked:focus, .background-app-item .keyboard-brightness-level .close-button:checked:focus, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:focus, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:focus, .keyboard-brightness-level .calendar .calendar-day:checked:focus, .calendar .keyboard-brightness-level .calendar-day:checked:focus {
++      background-color: #4b92e7;
++      color: white; }
++    .keyboard-brightness-level .button:checked:active, .keyboard-brightness-level .icon-button:checked:active, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:active, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:active, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:active, .keyboard-brightness-level .background-app-item .close-button:checked:active, .background-app-item .keyboard-brightness-level .close-button:checked:active, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:active, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:active, .keyboard-brightness-level .calendar .calendar-day:checked:active, .calendar .keyboard-brightness-level .calendar-day:checked:active {
++      background-color: #1d72d8;
++      color: #ededed; }
++    .keyboard-brightness-level .button:checked:insensitive, .keyboard-brightness-level .icon-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:insensitive, .keyboard-brightness-level .background-app-item .close-button:checked:insensitive, .background-app-item .keyboard-brightness-level .close-button:checked:insensitive, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:insensitive, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:insensitive, .keyboard-brightness-level .calendar .calendar-day:checked:insensitive, .calendar .keyboard-brightness-level .calendar-day:checked:insensitive {
++      transition-duration: 100ms;
++      color: rgba(255, 255, 255, 0.5);
++      background-color: rgba(255, 255, 255, 0.05);
++      background-color: rgba(53, 132, 228, 0.5);
++      color: rgba(255, 255, 255, 0.5); }
++
 +.background-apps-quick-toggle {
 +  min-height: 40px;
 +  background-color: transparent; }
 +  .background-apps-quick-toggle StIcon {
 +    icon-size: 1.09em !important; }
 +
 +.background-app-item .popup-menu-icon {
 +  icon-size: 2.18em !important;
 +  -st-icon-style: regular !important; }
 +
 +.background-app-item .close-button {
 +  padding: 6px; }
 +
 +.background-app-item .spinner {
 +  padding: 6px; }
 +
 +.background-app-item.popup-inactive-menu-item {
 +  color: #ffffff; }
 +
 +/* OVERVIEW */
 +.controls-manager, .secondary-monitor-workspaces {
 +  spacing: 12px; }
 +
 +#overviewGroup {
 +  background-color: #000000; }
 +
 +.overview-controls {
 +  padding-bottom: 32px; }
 +
 +/* Window Picker */
 +.window-picker {
 +  spacing: 6px; }
 +
 +.window-close, .screenshot-ui-close-button {
 +  background-color: rgba(31, 31, 31, 0.98);
 +  color: #ffffff;
 +  border-radius: 99px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0);
 +  padding: 3px;
 +  height: 30px;
 +  width: 30px;
 +  transition-duration: 100ms;
 +  border: 2px solid rgba(255, 255, 255, 0.3); }
 +  .window-close StIcon, .screenshot-ui-close-button StIcon {
 +    icon-size: 24px; }
 +  .window-close:hover, .screenshot-ui-close-button:hover {
 +    background-color: rgba(48, 48, 48, 0.98); }
 +  .window-close:active, .screenshot-ui-close-button:active {
 +    background-color: rgba(64, 64, 64, 0.98); }
 +
 +.workspace-background {
 +  border-radius: 30px;
 +  background-color: rgba(3, 2, 1, 0);
 +  box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0); }
 +
 +.search-entry {
 +  border-radius: 99px;
 +  margin-top: 12px;
 +  margin-bottom: 6px;
 +  width: 24em; }
 +  .search-entry .search-entry-icon {
 +    icon-size: 1.09em;
 +    margin-top: 2px;
 +    padding: 0 4px; }
 +
 +/* Search */
 +#searchResults {
 +  margin: 0 4px; }
 +
 +#searchResultsContent {
 +  max-width: 1072px; }
 +
 +.search-section {
 +  spacing: 18px; }
 +  .search-section .search-section-separator {
 +    height: 8px;
 +    background-color: transparent; }
 +
 +.search-section-content {
 +  background-color: #252525;
 +  color: #ffffff;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 0 12px; }
 +
 +.list-search-result, .search-provider-icon {
 +  background-color: transparent;
 +  border-radius: 11px; }
 +  .list-search-result:hover, .search-provider-icon:hover {
 +    background-color: rgba(255, 255, 255, 0.1); }
 +  .list-search-result:selected, .search-provider-icon:selected, .list-search-result:focus, .search-provider-icon:focus {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +    .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:focus:hover, .search-provider-icon:focus:hover {
 +      background-color: rgba(255, 255, 255, 0.16); }
 +    .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:focus:active, .search-provider-icon:focus:active {
 +      background-color: rgba(255, 255, 255, 0.13); }
 +  .list-search-result:active, .search-provider-icon:active {
 +    background-color: rgba(255, 255, 255, 0.16); }
 +  .list-search-result:outlined, .search-provider-icon:outlined, .list-search-result:checked, .search-provider-icon:checked {
 +    background-color: rgba(255, 255, 255, 0.19); }
 +    .list-search-result:outlined:active, .search-provider-icon:outlined:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
 +      background-color: rgba(255, 255, 255, 0.22); }
 +    .list-search-result:outlined:hover, .search-provider-icon:outlined:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
 +      background-color: rgba(255, 255, 255, 0.25); }
 +  .list-search-result:drop, .search-provider-icon:drop {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.search-statustext {
 +  color: rgba(255, 255, 255, 0.8); }
 +
 +.grid-search-results {
 +  spacing: 30px;
 +  margin: 0 12px; }
 +
 +.search-provider-icon:ltr {
 +  margin-right: 4px; }
 +
 +.search-provider-icon:rtl {
 +  margin-left: 4px; }
 +
 +.search-provider-icon .list-search-provider-content {
 +  spacing: 12px; }
 +  .search-provider-icon .list-search-provider-content .list-search-provider-details {
 +    width: 120px;
 +    color: #ffffff; }
 +
 +.list-search-results {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-content {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-title {
 +  spacing: 12px; }
 +
 +.list-search-result .list-search-result-description {
 +  color: #868686; }
 +
 +/* Dash */
 +#dash {
 +  margin-top: 12px; }
 +  #dash .placeholder {
 +    background-image: none;
 +    background-size: contain;
 +    height: 32px; }
 +  #dash .empty-dash-drop-target {
 +    width: 32px;
 +    height: 32px; }
 +  #dash .app-well-app-running-dot {
 +    margin-bottom: 14px; }
 +
 +.dash-background {
 +  background-color: #252525;
 +  border-radius: 28px;
 +  padding: 12px;
 +  spacing: 6px;
 +  margin-bottom: 12px;
 +  border: 2px solid rgba(255, 255, 255, 0.3);
 +  box-shadow: none; }
 +
 +.dash-item-container > * {
 +  margin: 0 2px; }
 +
 +.dash-item-container:ltr:first-child {
 +  margin-left: 0; }
 +
 +.dash-item-container:rtl:first-child {
 +  margin-right: 0; }
 +
 +.dash-item-container .app-well-app .overview-icon, .dash-item-container .grid-search-result .overview-icon {
 +  padding: 6px;
 +  border-radius: 16px; }
 +
 +.dash-item-container .show-apps {
 +  transition-duration: 400ms; }
 +  .dash-item-container .show-apps .overview-icon {
 +    background-color: transparent; }
 +  .dash-item-container .show-apps:hover .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +  .dash-item-container .show-apps:selected .overview-icon, .dash-item-container .show-apps:focus .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +    .dash-item-container .show-apps:selected .overview-icon:hover .overview-icon, .dash-item-container .show-apps:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.16); }
 +    .dash-item-container .show-apps:selected .overview-icon:active .overview-icon, .dash-item-container .show-apps:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.13); }
 +  .dash-item-container .show-apps:active .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.16); }
 +  .dash-item-container .show-apps:outlined .overview-icon, .dash-item-container .show-apps:checked .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.19); }
 +    .dash-item-container .show-apps:outlined .overview-icon:active .overview-icon, .dash-item-container .show-apps:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.22); }
 +    .dash-item-container .show-apps:outlined .overview-icon:hover .overview-icon, .dash-item-container .show-apps:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.25); }
 +  .dash-item-container .show-apps:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.dash-item-container .show-apps, .dash-item-container .app-well-app, .dash-item-container .grid-search-result {
 +  padding-bottom: 12px;
 +  color: #ffffff; }
 +
 +.dash-separator {
 +  width: 1px;
 +  margin: 0 4px;
 +  background-color: rgba(255, 255, 255, 0.1);
 +  margin-bottom: 12px;
 +  width: 2px; }
 +
 +.dash-label {
 +  -y-offset: 8px; }
 +
 +/* App Grid */
 +.icon-grid {
 +  row-spacing: 12px;
 +  column-spacing: 12px;
 +  max-row-spacing: 42px;
 +  max-column-spacing: 42px;
 +  page-padding-top: 24px;
 +  page-padding-bottom: 24px;
 +  page-padding-left: 18px;
 +  page-padding-right: 18px; }
 +
 +/* App Icons */
 +.app-well-app, .grid-search-result {
 +  transition-duration: 400ms; }
 +  .app-well-app .overview-icon, .grid-search-result .overview-icon {
 +    background-color: transparent; }
 +  .app-well-app:hover .overview-icon, .grid-search-result:hover .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +  .app-well-app:selected .overview-icon, .grid-search-result:selected .overview-icon, .app-well-app:focus .overview-icon, .grid-search-result:focus .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +    .app-well-app:selected .overview-icon:hover .overview-icon, .grid-search-result:selected .overview-icon:hover .overview-icon, .app-well-app:focus .overview-icon:hover .overview-icon, .grid-search-result:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.16); }
 +    .app-well-app:selected .overview-icon:active .overview-icon, .grid-search-result:selected .overview-icon:active .overview-icon, .app-well-app:focus .overview-icon:active .overview-icon, .grid-search-result:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.13); }
 +  .app-well-app:active .overview-icon, .grid-search-result:active .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.16); }
 +  .app-well-app:outlined .overview-icon, .grid-search-result:outlined .overview-icon, .app-well-app:checked .overview-icon, .grid-search-result:checked .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.19); }
 +    .app-well-app:outlined .overview-icon:active .overview-icon, .grid-search-result:outlined .overview-icon:active .overview-icon, .app-well-app:checked .overview-icon:active .overview-icon, .grid-search-result:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.22); }
 +    .app-well-app:outlined .overview-icon:hover .overview-icon, .grid-search-result:outlined .overview-icon:hover .overview-icon, .app-well-app:checked .overview-icon:hover .overview-icon, .grid-search-result:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.25); }
 +  .app-well-app:drop .overview-icon, .grid-search-result:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +  .app-well-app .overview-icon, .grid-search-result .overview-icon {
 +    padding: 12px;
 +    border-radius: 24px;
 +    color: #ffffff; }
 +  .app-well-app .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
 +    spacing: 6px; }
 +
 +.app-well-app.app-folder, .app-folder.grid-search-result {
 +  transition-duration: 400ms; }
 +  .app-well-app.app-folder .overview-icon, .app-folder.grid-search-result .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.07); }
 +  .app-well-app.app-folder:hover .overview-icon, .app-folder.grid-search-result:hover .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +  .app-well-app.app-folder:selected .overview-icon, .app-folder.grid-search-result:selected .overview-icon, .app-well-app.app-folder:focus .overview-icon, .app-folder.grid-search-result:focus .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.13); }
 +    .app-well-app.app-folder:selected .overview-icon:hover .overview-icon, .app-folder.grid-search-result:selected .overview-icon:hover .overview-icon, .app-well-app.app-folder:focus .overview-icon:hover .overview-icon, .app-folder.grid-search-result:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.16); }
 +    .app-well-app.app-folder:selected .overview-icon:active .overview-icon, .app-folder.grid-search-result:selected .overview-icon:active .overview-icon, .app-well-app.app-folder:focus .overview-icon:active .overview-icon, .app-folder.grid-search-result:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.13); }
 +  .app-well-app.app-folder:active .overview-icon, .app-folder.grid-search-result:active .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.16); }
 +  .app-well-app.app-folder:outlined .overview-icon, .app-folder.grid-search-result:outlined .overview-icon, .app-well-app.app-folder:checked .overview-icon, .app-folder.grid-search-result:checked .overview-icon {
 +    background-color: rgba(255, 255, 255, 0.19); }
 +    .app-well-app.app-folder:outlined .overview-icon:active .overview-icon, .app-folder.grid-search-result:outlined .overview-icon:active .overview-icon, .app-well-app.app-folder:checked .overview-icon:active .overview-icon, .app-folder.grid-search-result:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.22); }
 +    .app-well-app.app-folder:outlined .overview-icon:hover .overview-icon, .app-folder.grid-search-result:outlined .overview-icon:hover .overview-icon, .app-well-app.app-folder:checked .overview-icon:hover .overview-icon, .app-folder.grid-search-result:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(255, 255, 255, 0.25); }
 +  .app-well-app.app-folder:drop .overview-icon, .app-folder.grid-search-result:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.app-folder-dialog {
 +  border-radius: 64px;
-   box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
++  background-color: #252525;
 +  padding: 12px;
-       width: 12em; }
++  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
 +  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.3); }
 +  .app-folder-dialog .folder-name-container {
 +    padding: 24px 36px 0;
 +    spacing: 12px;
 +    /* FIXME: this is to keep the label in sync with the entry */ }
 +    .app-folder-dialog .folder-name-container .folder-name-entry {
-       transition-duration: 100ms;
-       color: rgba(255, 255, 255, 0.5);
-       background-color: rgba(255, 255, 255, 0.05);
-       background-color: transparent;
-       color: rgba(255, 255, 255, 0.5); }
++      width: 12em;
++      color: #ffffff !important; }
 +    .app-folder-dialog .folder-name-container .folder-name-label {
 +      padding: 5px 7px;
 +      color: #ffffff; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button {
 +      padding: 0;
 +      width: 36px;
 +      height: 36px;
 +      border-radius: 99px; }
 +      .app-folder-dialog .folder-name-container .edit-folder-button > StIcon {
 +        icon-size: 1.09em; }
 +  .app-folder-dialog .icon-grid {
 +    row-spacing: 12px;
 +    column-spacing: 30px;
 +    page-padding-top: 0;
 +    page-padding-bottom: 0;
 +    page-padding-left: 0;
 +    page-padding-right: 0; }
 +  .app-folder-dialog .page-indicators {
 +    margin-bottom: 18px; }
 +
 +.app-folder-dialog-container {
 +  padding: 12px;
 +  width: 720px;
 +  height: 720px; }
 +
 +.app-well-app-running-dot {
 +  height: 5px;
 +  width: 5px;
 +  border-radius: 5px;
 +  margin-bottom: 8px;
 +  background-color: #ffffff; }
 +
 +.rename-folder-popup .rename-folder-popup-item {
 +  spacing: 6px; }
 +  .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
 +    padding: 0 12px; }
 +
 +.page-indicator {
 +  padding: 6px 12px 0;
 +  transition-duration: 400ms; }
 +  .page-indicator .page-indicator-icon {
 +    width: 10px;
 +    height: 10px;
 +    border-radius: 10px;
 +    background-color: white;
 +    transition-duration: 400ms; }
 +
 +.apps-scroll-view {
 +  padding: 0; }
 +
 +.system-action-icon {
 +  background-color: rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 99px;
 +  icon-size: 48px;
 +  box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.3); }
 +
 +.page-navigation-hint.dnd {
 +  background: rgba(255, 255, 255, 0.1); }
 +
 +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
 +  background-gradient-start: rgba(255, 255, 255, 0.05);
 +  background-gradient-end: transparent;
 +  background-gradient-direction: horizontal;
 +  border-radius: 24px 0px 0px 24px; }
 +
 +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
 +  background-gradient-start: transparent;
 +  background-gradient-end: rgba(255, 255, 255, 0.05);
 +  background-gradient-direction: horizontal;
 +  border-radius: 0px 24px 24px 0px; }
 +
 +.page-navigation-arrow {
 +  margin: 6px;
 +  padding: 18px;
 +  width: 24px;
 +  height: 24px;
 +  border-radius: 99px;
 +  transition-duration: 100ms;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: rgba(117, 117, 117, 0.6);
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .page-navigation-arrow > StIcon {
 +    color: #ffffff; }
 +  .page-navigation-arrow:insensitive {
 +    transition-duration: 100ms;
 +    background-color: transparent;
 +    background-color: none;
 +    box-shadow: none; }
 +    .page-navigation-arrow:insensitive:insensitive {
-   border-radius: 0 0 16px 16px;
++      background-color: transparent; }
 +  .page-navigation-arrow:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: rgba(125, 125, 125, 0.6); }
 +  .page-navigation-arrow:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: rgba(132, 132, 132, 0.6); }
 +
 +/* Workspace pager */
 +.workspace-thumbnails {
 +  visible-width: 32px;
 +  spacing: 6px;
 +  padding: 6px; }
 +  .workspace-thumbnails .workspace-thumbnail {
 +    color: #ffffff;
 +    background-color: #262626;
 +    border-radius: 4px;
 +    border: 1px solid transparent;
 +    border-color: rgba(255, 255, 255, 0.3); }
 +  .workspace-thumbnails .placeholder {
 +    background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
 +    background-size: contain;
 +    width: 18px; }
 +
 +.workspace-thumbnail-indicator {
 +  border: 3px solid #3584e4;
 +  border-radius: 8px; }
 +
 +.ripple-pointer-location {
 +  width: 50px;
 +  height: 50px;
 +  border-radius: 25px;
 +  background-color: rgba(188, 214, 246, 0.3);
 +  box-shadow: 0 0 2px 2px #8fbbf0; }
 +
 +.pie-timer {
 +  width: 60px;
 +  height: 60px;
 +  -pie-border-width: 3px;
 +  -pie-border-color: #3584e4;
 +  -pie-background-color: rgba(233, 242, 252, 0.3); }
 +
 +.magnifier-zoom-region {
 +  border: 2px solid #3584e4; }
 +  .magnifier-zoom-region.full-screen {
 +    border-width: 0; }
 +
 +.select-area-rubberband {
 +  background-color: rgba(53, 132, 228, 0.3);
 +  border: 1px solid #3584e4; }
 +
 +.user-icon {
 +  background-size: contain;
 +  color: #ffffff;
 +  border-radius: 99px;
 +  icon-size: 4.36em; }
 +  .user-icon StIcon {
 +    background-color: rgba(255, 255, 255, 0.05);
 +    border-radius: 99px;
 +    padding: 12px;
 +    width: 2.725em;
 +    height: 2.725em; }
 +  .user-icon.user-avatar {
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +
 +.lightbox {
 +  background-color: black; }
 +
 +.flashspot {
 +  background-color: white; }
 +
 +.hidden {
 +  color: transparent; }
 +
 +.caps-lock-warning-label {
 +  text-align: center;
 +  padding-bottom: 8px;
 +  color: #f6d32d; }
 +
 +/* Workspace animation */
 +.workspace-animation {
 +  background-color: #0d0d0d; }
 +
 +/* Tiled window previews */
 +.tile-preview {
 +  background-color: rgba(53, 132, 228, 0.5);
 +  border: 1px solid #3584e4; }
 +
 +/* On-screen Keyboard */
 +#keyboard {
 +  background-color: #000000;
 +  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2); }
 +  #keyboard .page-indicator {
 +    padding: 6px; }
 +    #keyboard .page-indicator .page-indicator-icon {
 +      width: 8px;
 +      height: 8px; }
 +
 +.key-container {
 +  padding: 4px;
 +  spacing: 4px; }
 +
 +.keyboard-key {
 +  font-size: 16pt;
 +  font-weight: bold;
 +  min-height: 1.2em;
 +  min-width: 1.2em;
 +  border-width: 1px;
 +  border-style: solid;
 +  border-radius: 12px;
 +  box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0);
 +  color: #ffffff;
 +  background-color: #545454; }
 +  .keyboard-key:focus {
 +    color: #ffffff;
 +    background-color: #0c141e;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +    .keyboard-key:focus:hover {
 +      background-color: #182029;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .keyboard-key:focus:active {
 +      background-color: #1c242e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +  .keyboard-key:hover {
 +    color: #ffffff;
 +    background-color: #5e5e5e; }
 +  .keyboard-key:active {
 +    color: #ffffff;
 +    background-color: #666666; }
 +  .keyboard-key:checked {
 +    color: #ffffff;
 +    background-color: #737373; }
 +  .keyboard-key:grayed {
 +    background-color: #121212;
 +    color: #ffffff;
 +    border-color: rgba(255, 255, 255, 0.2); }
 +  .keyboard-key.default-key {
 +    color: #ffffff;
 +    background-color: #3b3b3b;
 +    border-radius: 12px; }
 +    .keyboard-key.default-key:hover {
 +      color: #ffffff;
 +      background-color: #454545; }
 +    .keyboard-key.default-key:active {
 +      color: #ffffff;
 +      background-color: #4d4d4d; }
 +    .keyboard-key.default-key:checked {
 +      color: #ffffff;
 +      background-color: #595959; }
 +    .keyboard-key.default-key:latched {
 +      border-color: #4b92e7;
 +      background-color: #3584e4; }
 +  .keyboard-key.enter-key {
 +    color: #ffffff;
 +    background-color: #428ce6;
 +    border-radius: 12px;
 +    color: #ffffff; }
 +    .keyboard-key.enter-key:hover {
 +      color: #ffffff;
 +      background-color: #5497e8; }
 +    .keyboard-key.enter-key:active {
 +      color: #ffffff;
 +      background-color: #629fea; }
 +    .keyboard-key.enter-key:checked {
 +      color: #ffffff;
 +      background-color: #78aded; }
 +  .keyboard-key.shift-key-uppercase {
 +    background-color: gray;
 +    color: #000000; }
 +    .keyboard-key.shift-key-uppercase:hover {
 +      background-color: #8c8c8c;
 +      color: #0d0d0d; }
 +  .keyboard-key StIcon {
 +    icon-size: 24px; }
 +
 +.keyboard-subkeys {
 +  -arrow-border-radius: 16px;
 +  -arrow-background-color: #000000;
 +  -arrow-border-width: 1px;
 +  -arrow-border-color: #171717;
 +  -arrow-base: 20px;
 +  -arrow-rise: 10px;
 +  -boxpointer-gap: 6px;
 +  padding: 6px; }
 +  .keyboard-subkeys .keyboard-key {
 +    color: #ffffff;
 +    background-color: #545454;
 +    border-radius: 12px; }
 +    .keyboard-subkeys .keyboard-key:focus {
 +      color: #ffffff;
 +      background-color: #0c141e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +      .keyboard-subkeys .keyboard-key:focus:hover {
 +        background-color: #182029;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +      .keyboard-subkeys .keyboard-key:focus:active {
 +        background-color: #1c242e;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .keyboard-subkeys .keyboard-key:hover {
 +      color: #ffffff;
 +      background-color: #5e5e5e; }
 +    .keyboard-subkeys .keyboard-key:active {
 +      color: #ffffff;
 +      background-color: #666666; }
 +    .keyboard-subkeys .keyboard-key:checked {
 +      color: #ffffff;
 +      background-color: #737373; }
 +
 +.emoji-page .keyboard-key {
 +  background-color: transparent;
 +  border: none;
 +  color: initial; }
 +
 +.emoji-panel .keyboard-key:latched {
 +  border-color: #4b92e7;
 +  background-color: #3584e4; }
 +
 +.word-suggestions {
 +  font-size: 12pt;
 +  spacing: 12px;
 +  min-height: 17pt;
 +  padding: 12px;
 +  color: #ffffff; }
 +  .word-suggestions StButton {
 +    margin: 0 3px;
 +    min-width: 32px;
 +    border-radius: 6px;
 +    padding: 0px 18px;
 +    background-color: transparent;
 +    background-image: none; }
 +    .word-suggestions StButton:focus {
 +      color: #ffffff;
 +      background-color: #0c141e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +      .word-suggestions StButton:focus:hover {
 +        background-color: #182029;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +      .word-suggestions StButton:focus:active {
 +        background-color: #1c242e;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .word-suggestions StButton:hover {
 +      color: #ffffff;
 +      background-color: #5e5e5e; }
 +    .word-suggestions StButton:active {
 +      color: #ffffff;
 +      background-color: #666666; }
 +    .word-suggestions StButton:checked {
 +      color: #ffffff;
 +      background-color: #737373; }
 +
 +/* Looking Glass */
 +#LookingGlassDialog {
 +  background-color: rgba(0, 0, 0, 0.98);
 +  color: #ffffff;
++  border-radius: 16px;
++  margin-top: 4px;
 +  border-top-width: 0;
 +  padding: 6px;
 +  spacing: 6px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0);
 +  border: 2px solid rgba(255, 255, 255, 0.3);
 +  background-color: #000000;
 +  box-shadow: none; }
 +  #LookingGlassDialog > #Toolbar {
 +    border: none;
 +    padding: 6px;
 +    border-radius: 0;
 +    background-color: transparent;
 +    spacing: 6px; }
 +    #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +      padding: 6px 12px; }
 +      #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
 +        icon-size: 1.09em; }
 +  #LookingGlassDialog .labels {
 +    spacing: 6px; }
 +  #LookingGlassDialog .notebook-tab {
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 12px;
 +    padding: 6px 12px; }
 +  #LookingGlassDialog StBoxLayout#EvalBox {
 +    padding: 4px;
 +    spacing: 6px;
 +    padding: 6px; }
 +  #LookingGlassDialog StBoxLayout#ResultsArea {
 +    spacing: 6px;
 +    padding: 6px; }
 +
 +.lg-dialog StEntry {
 +  min-height: 22px; }
 +
 +.lg-dialog .shell-link {
 +  color: #8fbbf0; }
 +  .lg-dialog .shell-link:hover {
 +    color: #bcd6f6; }
 +  .lg-dialog .shell-link:active {
 +    color: #629fea; }
 +
 +.lg-dialog .actor-link {
 +  color: #8c8c8c; }
 +  .lg-dialog .actor-link:hover {
 +    color: #bfbfbf; }
 +  .lg-dialog .actor-link:active {
 +    color: #595959; }
 +  .lg-dialog .actor-link StIcon {
 +    icon-size: 12px; }
 +
 +.lg-completions-text {
 +  font-style: italic; }
 +
 +.lg-obj-inspector-title {
 +  spacing: 6px; }
 +
 +.lg-obj-inspector-button {
 +  border: 1px solid rgba(255, 255, 255, 0.3);
 +  padding: 4px;
 +  border-radius: 8px; }
 +  .lg-obj-inspector-button:hover {
 +    border: 1px solid #ffffff; }
 +
 +#lookingGlassExtensions {
 +  padding: 6px; }
 +
 +.lg-extensions-list {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +.lg-extension {
 +  padding: 12px;
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #ffffff;
 +  background-color: #474747;
 +  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +  .lg-extension:hover {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #4f4f4f; }
 +  .lg-extension:active {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #565656; }
 +  .lg-extension:focus {
 +    transition-duration: 100ms;
 +    color: #ffffff;
 +    background-color: #454d57;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .lg-extension:focus:hover {
 +      background-color: #4c545e;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .lg-extension:focus:active {
 +      background-color: #535b64;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .lg-extension:insensitive {
 +    transition-duration: 100ms;
 +    color: rgba(255, 255, 255, 0.5);
 +    background-color: rgba(255, 255, 255, 0.05); }
 +
 +.lg-extension-meta {
 +  spacing: 6px; }
 +
 +#LookingGlassPropertyInspector {
 +  background: #1a1a1a;
 +  border: 1px solid rgba(255, 255, 255, 0.3);
 +  border-radius: 8px;
 +  padding: 6px; }
 +
 +.lg-debug-flag-button {
 +  color: #ffffff; }
 +  .lg-debug-flag-button StLabel {
 +    padding: 6px, 12px; }
 +  .lg-debug-flag-button:hover {
 +    color: white; }
 +  .lg-debug-flag-button:active {
 +    color: #cccccc; }
 +
 +.lg-debug-flags-header {
 +  padding-top: 12px;
 +  padding: 6px; }
 +
 +.login-dialog .caps-lock-warning-label,
 +.login-dialog .login-dialog-message-warning,
 +.unlock-dialog .caps-lock-warning-label,
 +.unlock-dialog .login-dialog-message-warning {
 +  color: #ffffff; }
 +
 +/* Login Dialog */
 +.login-dialog {
 +  background-color: #0d0d0d; }
 +
 +.login-dialog-button.cancel-button {
 +  padding: 9px; }
 +
 +.login-dialog-button-box {
 +  width: 23em;
 +  spacing: 12px; }
 +
 +.login-dialog-logo-bin {
 +  margin: 3em 0; }
 +
 +.login-dialog-banner {
 +  color: #e6e6e6; }
 +
 +.login-dialog-banner-view {
 +  max-width: 23em; }
 +
 +.login-dialog-message {
 +  text-align: center; }
 +
 +.login-dialog-user-selection-box {
 +  padding: 100px 0px; }
 +
 +.login-dialog-not-listed-label {
 +  font-size: 11pt;
 +  font-weight: bold;
 +  color: #b3b3b3;
 +  padding: 12px; }
 +  .login-dialog-not-listed-button:focus .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
 +    color: #ffffff; }
 +  .login-dialog-not-listed-button:focus .login-dialog-not-listed-label {
 +    text-decoration: underline; }
 +
 +.login-dialog-auth-list-view {
 +  -st-vfade-offset: 1em; }
 +
 +.login-dialog-auth-list {
 +  spacing: 6px;
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-title {
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-item {
 +  border-radius: 16px;
 +  padding: 4px;
 +  color: #b3b3b3; }
 +  .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +
 +.login-dialog-auth-list-label {
 +  font-size: 13pt;
 +  font-weight: bold;
 +  padding-left: 15px; }
 +  .login-dialog-auth-list-label:ltr {
 +    padding-left: 14px;
 +    text-align: left; }
 +  .login-dialog-auth-list-label:rtl {
 +    padding-right: 14px;
 +    text-align: right; }
 +
 +.login-dialog-user-list-view {
 +  -st-vfade-offset: 1em; }
 +
 +.login-dialog-user-list {
 +  spacing: 12px;
 +  width: 23em; }
 +  .login-dialog-user-list .login-dialog-user-list-item {
 +    border-radius: 12px;
 +    padding: 6px;
 +    background-color: rgba(255, 255, 255, 0.05);
 +    color: #ffffff;
 +    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3); }
 +    .login-dialog-user-list .login-dialog-user-list-item .user-widget .user-icon {
 +      border: 4px solid transparent; }
 +    .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
 +      height: 2px;
 +      margin-top: 6px;
 +      background-color: #b3b3b3; }
 +    .login-dialog-user-list .login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
 +      background-color: #ffffff; }
 +  .login-dialog-user-list:expanded .login-dialog-user-list-item {
 +    transition-duration: 300ms;
 +    transition-timing-function: ease; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:hover {
 +      background-color: rgba(255, 255, 255, 0.1);
 +      color: #ffffff; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
 +      background-color: #3584e4;
 +      color: #ffffff; }
 +      .login-dialog-user-list:expanded .login-dialog-user-list-item:selected:hover {
 +        background-color: #4b92e7; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in .user-widget .user-icon {
 +      border-color: #3584e4; }
 +
 +.login-dialog-prompt-layout {
 +  spacing: 12px;
 +  width: 26em; }
 +
 +/* Screen Shield */
 +.unlock-dialog {
 +  background-color: transparent; }
 +
 +.screen-shield-background {
 +  background: black;
 +  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
 +
 +#lockDialogGroup {
 +  background-color: #0d0d0d; }
 +
 +.unlock-dialog-clock {
 +  color: #ffffff;
 +  spacing: 2em; }
 +  .unlock-dialog-clock .unlock-dialog-clock-time {
 +    font-size: 72pt;
 +    font-weight: 200; }
 +  .unlock-dialog-clock .unlock-dialog-clock-date {
 +    font-weight: 400; }
 +  .unlock-dialog-clock .unlock-dialog-clock-hint {
 +    margin-top: 2em;
 +    padding: 6px 18px;
 +    border-radius: 16px;
 +    font-weight: bold; }
 +
 +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
 +  background-color: rgba(26, 26, 26, 0.3); }
 +  #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
 +    background-color: rgba(26, 26, 26, 0.5); }
 +  #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
 +    background-color: rgba(53, 132, 228, 0.5); }
 +
 +.unlock-dialog-notifications-container {
 +  margin: 12px;
 +  spacing: 6px;
 +  width: 23em;
 +  background-color: transparent; }
 +  .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
 +    padding-top: 0;
 +    padding-bottom: 0; }
 +  .unlock-dialog-notifications-container .notification,
 +  .unlock-dialog-notifications-container .unlock-dialog-notification-source {
 +    padding: 12px 16px;
 +    border: none;
 +    background-color: rgba(255, 255, 255, 0.1);
 +    color: #ffffff;
 +    border-radius: 16px; }
 +    .unlock-dialog-notifications-container .notification.critical,
 +    .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
 +      background-color: rgba(255, 255, 255, 0.2); }
 +
 +.unlock-dialog-notification-label {
 +  padding-left: 12px;
 +  padding-right: 0; }
 +  .unlock-dialog-notification-label:rtl {
 +    padding-right: 12px;
 +    padding-left: 0; }
 +
 +.unlock-dialog-notification-count-text {
 +  font-weight: bold;
 +  padding: 0 12px;
 +  color: #ffffff;
 +  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 99px; }
 +
 +.user-widget .user-widget-label {
 +  color: #ffffff; }
 +
 +.user-widget.horizontal {
 +  spacing: 18px; }
 +  .user-widget.horizontal .user-icon StIcon {
 +    padding: 12px;
 +    icon-size: 2.18em;
 +    width: 3.27em;
 +    height: 3.27em;
 +    background-color: rgba(255, 255, 255, 0.1); }
 +
 +.user-widget.vertical {
 +  spacing: 24px; }
 +  .user-widget.vertical .user-widget-label {
 +    text-align: center;
 +    margin-bottom: .75em; }
 +  .user-widget.vertical .user-icon {
 +    icon-size: 10.9em; }
 +    .user-widget.vertical .user-icon StIcon {
 +      padding: 32px;
 +      icon-size: 4.36em;
 +      background-color: rgba(255, 255, 255, 0.1); }
 +
 +.toggle-switch {
 +  width: 48px; }
 +
 +.toggle-switch {
 +  background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg"); }
 +  .toggle-switch:checked {
 +    background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
 +
 +#panel.login-screen, #panel.unlock-screen, #panel:overview {
 +  background-color: #000; }
 +
 +#panel .panel-button {
 +  color: #fff !important; }
 +
 +.window-picker .icon-dropshadow {
 +  icon-shadow: none;
 +  background-color: #000000;
 +  padding: 12px;
 +  border-radius: 16px; }
index 959bfa143c7ab7ecc37dbde3e8ccc4373e921497,0000000000000000000000000000000000000000..4c8257a31b139b4a4736d7bb9fbc7b56722dac2b
mode 100644,000000..100644
--- /dev/null
@@@ -1,2881 -1,0 +1,2937 @@@
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
 +/* This stylesheet is generated, DO NOT EDIT */
 +/* Copyright 2009, 2015 Red Hat, Inc.
 + *
 + * Portions adapted from Mx's data/style/default.css
 + *   Copyright 2009 Intel Corporation
 + *
 + * This program is free software; you can redistribute it and/or modify it
 + * under the terms and conditions of the GNU Lesser General Public License,
 + * version 2.1, as published by the Free Software Foundation.
 + *
 + * This program is distributed in the hope it will be useful, but WITHOUT ANY
 + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 + * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
 + * more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 + */
 +/* Global Values */
 +stage {
 +  font-size: 11pt;
 +  color: #282828; }
 +
 +/* Common Stylings */
 +.app-well-app.app-folder .overview-icon, .app-folder.grid-search-result .overview-icon, .app-well-app .overview-icon, .grid-search-result .overview-icon, .dash-item-container .show-apps .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box {
 +  border-radius: 16px;
 +  padding: 6px;
 +  spacing: 6px;
 +  border: 2px solid transparent;
 +  transition-duration: 200ms;
 +  text-align: center;
 +  color: inherit; }
 +
 +#LookingGlassDialog .notebook-tab, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, .app-folder-dialog .folder-name-container .edit-folder-button, .button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  border-radius: 8px;
 +  border-style: solid;
 +  border-width: 1px;
 +  font-weight: bold;
 +  padding: 3px 24px; }
 +
 +.app-folder-dialog .folder-name-container .edit-folder-button, .button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:focus, .button:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .pager-button:focus, .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .close-button:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:focus:hover, .button:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .background-app-item .close-button:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:focus:active, .button:focus:active, .calendar .calendar-day:focus:active, .calendar .calendar-month-header .pager-button:focus:active, .icon-button:focus:active, .login-dialog-button.cancel-button:focus:active, .login-dialog-button.switch-user-button:focus:active, .login-dialog-button.login-dialog-session-list-button:focus:active, .background-app-item .close-button:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:hover, .button:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .pager-button:hover, .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .close-button:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:insensitive, .button:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .close-button:insensitive {
 +    transition-duration: 100ms;
-       color: rgba(40, 40, 40, 0.5);
-       background-color: rgba(40, 40, 40, 0.05);
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:selected, .button:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .pager-button:selected, .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .background-app-item .close-button:selected, .app-folder-dialog .folder-name-container .edit-folder-button:active, .button:active, .calendar .calendar-day:active, .calendar .calendar-month-header .pager-button:active, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .close-button:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .app-folder-dialog .folder-name-container .edit-folder-button:checked, .button:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .pager-button:checked, .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .background-app-item .close-button:checked {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #c6c5c5; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:checked:hover, .button:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .background-app-item .close-button:checked:hover {
 +      background-color: #fbfbfb; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button:checked:active, .button:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .background-app-item .close-button:checked:active {
 +      background-color: white; }
 +  .app-folder-dialog .folder-name-container .default.edit-folder-button, .default.button, .calendar .default.calendar-day, .calendar .calendar-day.calendar-today, .calendar .calendar-month-header .default.pager-button, .default.icon-button, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .background-app-item .default.close-button {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:focus, .default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:hover, .default.button:hover, .calendar .default.calendar-day:hover, .calendar .calendar-day.calendar-today:hover, .calendar .calendar-month-header .default.pager-button:hover, .default.icon-button:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .default.close-button:hover, .app-folder-dialog .folder-name-container .default.edit-folder-button:focus, .default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:active, .default.button:active, .calendar .default.calendar-day:active, .calendar .calendar-day.calendar-today:active, .calendar .calendar-month-header .default.pager-button:active, .default.icon-button:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .default.close-button:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .app-folder-dialog .folder-name-container .default.edit-folder-button:insensitive, .default.button:insensitive, .calendar .default.calendar-day:insensitive, .calendar .calendar-day.calendar-today:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .default.icon-button:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .default.close-button:insensitive {
 +      transition-duration: 100ms;
-       color: rgba(40, 40, 40, 0.5);
-       background-color: rgba(40, 40, 40, 0.05); }
++      color: rgba(40, 40, 40, 0.4);
++      background-color: rgba(40, 40, 40, 0.1);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .app-folder-dialog .folder-name-container .flat.edit-folder-button, .calendar .app-folder-dialog .folder-name-container .calendar-day.edit-folder-button, .app-folder-dialog .folder-name-container .calendar .calendar-day.edit-folder-button, .flat.button, .calendar .button.calendar-day, .calendar .calendar-day.calendar-today, .calendar .flat.calendar-day, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .flat.icon-button, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .background-app-item .flat.close-button, .calendar .icon-button.calendar-day, .calendar .calendar-day.login-dialog-button.cancel-button, .calendar .calendar-day.login-dialog-button.switch-user-button, .calendar .calendar-day.login-dialog-button.login-dialog-session-list-button, .calendar .background-app-item .calendar-day.close-button, .background-app-item .calendar .calendar-day.close-button {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #dddcdc;
 +    background-color: transparent; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus, .flat.button:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .pager-button:focus, .flat.icon-button:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .flat.close-button:focus {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #ccd3dd;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus:hover, .flat.button:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .flat.icon-button:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .background-app-item .flat.close-button:focus:hover {
 +        background-color: #d3dae4;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:focus:active, .flat.button:focus:active, .calendar .calendar-day:focus:active, .calendar .calendar-month-header .pager-button:focus:active, .flat.icon-button:focus:active, .flat.login-dialog-button.cancel-button:focus:active, .flat.login-dialog-button.switch-user-button:focus:active, .flat.login-dialog-button.login-dialog-session-list-button:focus:active, .background-app-item .flat.close-button:focus:active {
 +        background-color: #dae1eb;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:hover, .flat.button:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .pager-button:hover, .flat.icon-button:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .flat.close-button:hover {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #d5d4d4; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:insensitive, .flat.button:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .flat.icon-button:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .flat.close-button:insensitive {
 +      transition-duration: 100ms;
-         color: rgba(40, 40, 40, 0.5);
-         background-color: rgba(40, 40, 40, 0.05);
++      color: rgba(40, 40, 40, 0.4);
++      background-color: rgba(40, 40, 40, 0.1); }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:selected, .flat.button:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .pager-button:selected, .flat.icon-button:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .background-app-item .flat.close-button:selected, .app-folder-dialog .folder-name-container .flat.edit-folder-button:active, .flat.button:active, .calendar .calendar-day:active, .calendar .calendar-month-header .pager-button:active, .flat.icon-button:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .flat.close-button:active {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #cecccc; }
 +    .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked, .flat.button:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .pager-button:checked, .flat.icon-button:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .background-app-item .flat.close-button:checked {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #c6c5c5; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked:hover, .flat.button:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .flat.icon-button:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .background-app-item .flat.close-button:checked:hover {
 +        background-color: #fbfbfb; }
 +      .app-folder-dialog .folder-name-container .flat.edit-folder-button:checked:active, .flat.button:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .flat.icon-button:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .background-app-item .flat.close-button:checked:active {
 +        background-color: white; }
 +    .app-folder-dialog .folder-name-container .flat.default.edit-folder-button, .flat.default.button, .calendar .default.calendar-day, .calendar .calendar-day.calendar-today, .calendar .calendar-month-header .default.pager-button, .default.icon-button, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .background-app-item .default.close-button {
 +      transition-duration: 100ms;
 +      background-color: #3584e4;
 +      color: #ffffff; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:focus, .flat.default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +        box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:hover, .flat.default.button:hover, .calendar .default.calendar-day:hover, .calendar .calendar-day.calendar-today:hover, .calendar .calendar-month-header .default.pager-button:hover, .default.icon-button:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .default.close-button:hover, .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:focus, .flat.default.button:focus, .calendar .default.calendar-day:focus, .calendar .calendar-day.calendar-today:focus, .calendar .calendar-month-header .default.pager-button:focus, .default.icon-button:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .background-app-item .default.close-button:focus {
 +        background-color: #4b92e7;
 +        color: white; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:active, .flat.default.button:active, .calendar .default.calendar-day:active, .calendar .calendar-day.calendar-today:active, .calendar .calendar-month-header .default.pager-button:active, .default.icon-button:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .background-app-item .default.close-button:active {
 +        background-color: #1d72d8;
 +        color: #ededed; }
 +      .app-folder-dialog .folder-name-container .flat.default.edit-folder-button:insensitive, .flat.default.button:insensitive, .calendar .default.calendar-day:insensitive, .calendar .calendar-day.calendar-today:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .default.icon-button:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .background-app-item .default.close-button:insensitive {
 +        transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++        color: rgba(40, 40, 40, 0.4);
++        background-color: rgba(40, 40, 40, 0.1);
 +        background-color: rgba(53, 132, 228, 0.5);
 +        color: rgba(255, 255, 255, 0.5); }
 +
 +.login-dialog-prompt-entry, .search-entry, .lg-dialog StEntry, StEntry {
 +  border-radius: 8px;
 +  padding: 9px 9px;
 +  selection-background-color: #3584e4;
 +  selected-color: #ffffff; }
 +
 +StEntry {
 +  transition-duration: 100ms;
 +  background-color: rgba(40, 40, 40, 0.15);
 +  color: rgba(40, 40, 40, 0.7); }
 +  StEntry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(40, 40, 40, 0.25); }
 +  StEntry:focus {
 +    transition-duration: 100ms;
 +    background-color: rgba(44, 65, 91, 0.2875);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
 +    color: #282828; }
 +  StEntry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(40, 40, 40, 0.25);
 +    color: rgba(40, 40, 40, 0.5); }
 +  StEntry StLabel.hint-text {
 +    color: rgba(40, 40, 40, 0.7); }
 +
 +.modal-dialog .modal-dialog-linked-button, .hotplug-notification-item, .notification-banner .notification-button {
 +  padding: 12px;
 +  font-weight: bold !important;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #cfcdca; }
 +  .modal-dialog .modal-dialog-linked-button:ltr, .hotplug-notification-item:ltr, .notification-banner .notification-button:ltr {
 +    margin-right: 1px; }
 +  .modal-dialog .modal-dialog-linked-button:rtl, .hotplug-notification-item:rtl, .notification-banner .notification-button:rtl {
 +    margin-left: 1px; }
 +  .modal-dialog .modal-dialog-linked-button:insensitive, .hotplug-notification-item:insensitive, .notification-banner .notification-button:insensitive {
 +    transition-duration: 100ms;
-   color: #282828;
-   background-color: #deddda;
-   border: 1px solid rgba(40, 40, 40, 0.02);
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .modal-dialog .modal-dialog-linked-button:focus, .hotplug-notification-item:focus, .notification-banner .notification-button:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #c0c6cd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .modal-dialog .modal-dialog-linked-button:focus:hover, .hotplug-notification-item:focus:hover, .notification-banner .notification-button:focus:hover {
 +      background-color: #c6cdd4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .modal-dialog .modal-dialog-linked-button:focus:active, .hotplug-notification-item:focus:active, .notification-banner .notification-button:focus:active {
 +      background-color: #cdd3db;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .modal-dialog .modal-dialog-linked-button:hover, .hotplug-notification-item:hover, .notification-banner .notification-button:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #c8c5c2; }
 +  .modal-dialog .modal-dialog-linked-button:active, .hotplug-notification-item:active, .notification-banner .notification-button:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #c0beba; }
 +  .modal-dialog .modal-dialog-linked-button:checked, .hotplug-notification-item:checked, .notification-banner .notification-button:checked {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #b9b6b2; }
 +    .modal-dialog .modal-dialog-linked-button:checked:hover, .hotplug-notification-item:checked:hover, .notification-banner .notification-button:checked:hover {
 +      background-color: #ecebea; }
 +    .modal-dialog .modal-dialog-linked-button:checked:active, .hotplug-notification-item:checked:active, .notification-banner .notification-button:checked:active {
 +      background-color: #f3f3f2; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:ltr, .hotplug-notification-item:first-child:ltr, .notification-banner .notification-button:first-child:ltr {
 +    border-radius: 0 0 0 16px; }
 +  .modal-dialog .modal-dialog-linked-button:last-child:ltr, .hotplug-notification-item:last-child:ltr, .notification-banner .notification-button:last-child:ltr {
 +    border-radius: 0 0 16px;
 +    margin-right: 0 !important; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:rtl, .hotplug-notification-item:first-child:rtl, .notification-banner .notification-button:first-child:rtl {
 +    border-radius: 0 0 16px; }
 +  .modal-dialog .modal-dialog-linked-button:last-child:rtl, .hotplug-notification-item:last-child:rtl, .notification-banner .notification-button:last-child:rtl {
 +    border-radius: 0 0 0 16px;
 +    margin-left: 0 !important; }
 +  .modal-dialog .modal-dialog-linked-button:first-child:last-child, .hotplug-notification-item:first-child:last-child, .notification-banner .notification-button:first-child:last-child {
 +    border-radius: 0 0 16px 16px;
 +    margin-left: 0 !important;
 +    margin-right: 0 !important; }
 +
 +.dash-label, .window-caption, .screenshot-ui-tooltip {
 +  background-color: rgba(0, 0, 0, 0.9);
 +  border: 1px solid rgba(255, 255, 255, 0.1);
 +  color: #ffffff;
 +  border-radius: 99px;
 +  padding: 6px 12px;
 +  text-align: center; }
 +
 +/* General Typography */
 +.user-widget.vertical .user-widget-label, .unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
 +  font-weight: 800;
 +  font-size: 20pt; }
 +
 +.lg-debug-flags-header, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
 +  font-weight: 800;
 +  font-size: 15pt; }
 +
 +.user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
 +  font-weight: 700;
 +  font-size: 15pt; }
 +
 +.bt-menu-placeholder.popup-menu-item, .message-dialog-content .message-dialog-title.lightweight, .headline {
 +  font-weight: 700;
 +  font-size: 13pt; }
 +
 +.lg-extension-name, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-forecast-temp, .weather-button .weather-header, .world-clocks-button .world-clocks-time, .world-clocks-button .world-clocks-header, .events-button .events-title, .calendar .calendar-month-header .calendar-month-label, .datemenu-today-button .day-label {
 +  font-weight: 700;
 +  font-size: 11pt; }
 +
 +.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
 +  font-weight: 700;
 +  font-size: 9pt; }
 +
 +.lg-completions-text, .caps-lock-warning-label, #dash, .background-app-item .subtitle, .icon-label-button-container, .prompt-dialog-error-label,
 +.prompt-dialog-info-label,
 +.prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .weather-button .weather-forecast-time, .world-clocks-button .world-clocks-timezone, .events-button .event-time {
 +  font-weight: 400;
 +  font-size: 9pt; }
 +
 +.calendar .calendar-day {
 +  font-weight: 400;
 +  font-size: 8pt; }
 +
 +.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-forecast-time, .world-clocks-button .world-clocks-timezone, .world-clocks-button .world-clocks-time, .events-button .event-time, .calendar .calendar-day {
 +  font-feature-settings: "tnum"; }
 +
 +/* OSD Elements */
 +#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-monitor-label, .osd-window {
-   background-color: rgba(40, 40, 40, 0.15);
-   color: rgba(40, 40, 40, 0.7); }
++  color: #ffffff;
++  background-color: #353535;
++  border: 1px solid rgba(255, 255, 255, 0.02);
 +  border-radius: 999px;
 +  padding: 12px; }
 +
 +.lg-dialog StEntry {
 +  transition-duration: 100ms;
-     background-color: rgba(40, 40, 40, 0.25); }
++  background-color: rgba(255, 255, 255, 0.15);
++  color: rgba(255, 255, 255, 0.7); }
 +  .lg-dialog StEntry:hover {
 +    transition-duration: 100ms;
-     background-color: rgba(44, 65, 91, 0.2875);
++    background-color: rgba(255, 255, 255, 0.25); }
 +  .lg-dialog StEntry:focus {
 +    transition-duration: 100ms;
-     color: #282828; }
++    background-color: rgba(201, 222, 248, 0.2875);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
-     background-color: rgba(40, 40, 40, 0.25);
-     color: rgba(40, 40, 40, 0.5); }
++    color: #ffffff; }
 +  .lg-dialog StEntry:insensitive {
 +    transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.7); }
++    background-color: rgba(255, 255, 255, 0.25);
++    color: rgba(255, 255, 255, 0.5); }
 +  .lg-dialog StEntry StLabel.hint-text {
-   color: #282828;
-   background-color: #c8c7c5; }
++    color: rgba(255, 255, 255, 0.7); }
 +
 +#LookingGlassDialog .notebook-tab, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++  color: #ffffff;
++  background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    transition-duration: 100ms;
-     color: #282828;
-     background-color: #b9c0c8;
++    color: rgba(255, 255, 255, 0.4);
++    background-color: rgba(255, 255, 255, 0.1); }
 +  #LookingGlassDialog .notebook-tab:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
 +    transition-duration: 100ms;
-       background-color: #c0c7cf;
++    color: #ffffff;
++    background-color: rgba(118, 172, 237, 0.19);
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    #LookingGlassDialog .notebook-tab:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
-       background-color: #c7ced6;
++      background-color: rgba(118, 172, 237, 0.19);
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    #LookingGlassDialog .notebook-tab:focus:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:active, .screenshot-ui-show-pointer-button:focus:active, .screenshot-ui-type-button:focus:active {
-     color: #282828;
-     background-color: #c1bfbd; }
++      background-color: rgba(118, 172, 237, 0.19);
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  #LookingGlassDialog .notebook-tab:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
 +    transition-duration: 100ms;
-     color: #282828;
-     background-color: #b9b8b5; }
++    color: #ffffff;
++    background-color: rgba(247, 247, 247, 0.1); }
 +  #LookingGlassDialog .notebook-tab:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
 +    transition-duration: 100ms;
-     color: #282828;
-     background-color: #b2b0ad; }
++    color: #ffffff;
++    background-color: rgba(240, 240, 240, 0.1); }
 +  #LookingGlassDialog .notebook-tab:outlined, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined, .screenshot-ui-show-pointer-button:outlined, .screenshot-ui-type-button:outlined, #LookingGlassDialog .notebook-tab:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
 +    transition-duration: 100ms;
-       background-color: #e6e5e4; }
++    color: #ffffff;
++    background-color: rgba(232, 232, 232, 0.1); }
 +    #LookingGlassDialog .notebook-tab:outlined:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined:hover, .screenshot-ui-show-pointer-button:outlined:hover, .screenshot-ui-type-button:outlined:hover, #LookingGlassDialog .notebook-tab:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
-       background-color: #ededec; }
++      background-color: rgba(255, 255, 255, 0.1); }
 +    #LookingGlassDialog .notebook-tab:outlined:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:outlined:active, .screenshot-ui-show-pointer-button:outlined:active, .screenshot-ui-type-button:outlined:active, #LookingGlassDialog .notebook-tab:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
-     transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++      background-color: rgba(255, 255, 255, 0.1); }
 +
 +.screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none; }
 +  .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
-       transition-duration: 100ms;
-       color: rgba(40, 40, 40, 0.5);
-       background-color: rgba(40, 40, 40, 0.05);
-       background-color: transparent;
-       color: rgba(255, 255, 255, 0.5); }
++    background-color: transparent; }
 +  .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
 +    transition-duration: 100ms;
 +    background-color: transparent;
 +    background-color: none;
 +    box-shadow: none; }
 +    .screenshot-ui-show-pointer-button:insensitive:insensitive, .screenshot-ui-type-button:insensitive:insensitive {
-     background-color: rgba(194, 215, 240, 0.2875);
-     box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7);
++      background-color: transparent; }
 +
 +/* System Elements */
 +.login-dialog-prompt-entry, .search-entry {
 +  transition-duration: 100ms;
 +  background-color: rgba(246, 245, 244, 0.15);
 +  color: rgba(246, 245, 244, 0.7); }
 +  .login-dialog-prompt-entry:hover, .search-entry:hover {
 +    transition-duration: 100ms;
 +    background-color: rgba(246, 245, 244, 0.25); }
 +  .login-dialog-prompt-entry:focus, .search-entry:focus {
 +    transition-duration: 100ms;
-     color: rgba(246, 245, 244, 0.5);
-     background-color: rgba(246, 245, 244, 0.05); }
++    background-color: rgba(246, 245, 244, 0.2625);
++    box-shadow: inset 0 0 0 2px rgba(246, 245, 244, 0.2);
 +    color: #f6f5f4; }
 +  .login-dialog-prompt-entry:insensitive, .search-entry:insensitive {
 +    transition-duration: 100ms;
 +    background-color: rgba(246, 245, 244, 0.25);
 +    color: rgba(246, 245, 244, 0.5); }
 +  .login-dialog-prompt-entry StLabel.hint-text, .search-entry StLabel.hint-text {
 +    color: rgba(246, 245, 244, 0.7); }
 +
 +.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
 +  transition-duration: 100ms;
 +  color: #f6f5f4;
 +  background-color: #4c4c4c; }
 +  .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
 +    transition-duration: 100ms;
-     transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++    color: rgba(246, 245, 244, 0.4);
++    background-color: rgba(246, 245, 244, 0.1); }
 +  .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #4a525b;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
 +      background-color: #515862;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .login-dialog-button.cancel-button:focus:active, .login-dialog-button.switch-user-button:focus:active, .login-dialog-button.login-dialog-session-list-button:focus:active {
 +      background-color: #575f69;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #444444; }
 +  .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #3d3d3d; }
 +  .login-dialog-button.cancel-button:outlined, .login-dialog-button.switch-user-button:outlined, .login-dialog-button.login-dialog-session-list-button:outlined, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: #353535; }
 +    .login-dialog-button.cancel-button:outlined:hover, .login-dialog-button.switch-user-button:outlined:hover, .login-dialog-button.login-dialog-session-list-button:outlined:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
 +      background-color: #6b6b6b; }
 +    .login-dialog-button.cancel-button:outlined:active, .login-dialog-button.switch-user-button:outlined:active, .login-dialog-button.login-dialog-session-list-button:outlined:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
 +      background-color: #727272; }
 +
 +/* WIDGETS */
 +.shell-link {
 +  color: #1b6acb; }
 +  .shell-link:hover {
 +    color: #3584e4; }
 +
 +.lowres-icon {
 +  icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); }
 +
 +.icon-dropshadow {
 +  icon-shadow: 0 1px 5px rgba(0, 0, 0, 0.8); }
 +
 +/* Entries */
 +StEntry StIcon.capslock-warning {
 +  icon-size: 1.09em;
 +  warning-color: #f5c211;
 +  padding: 0 4px; }
 +
 +StEntry StIcon.peek-password {
 +  icon-size: 1.09em;
 +  padding: 0 4px; }
 +
 +StEntry StLabel.hint-text {
 +  margin-left: 2px; }
 +
 +/* Buttons */
 +.button, .calendar .calendar-day.calendar-today, .calendar .calendar-day, .calendar .calendar-month-header .pager-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  min-height: 22px; }
 +
 +.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .background-app-item .close-button {
 +  border-radius: 99px;
 +  padding: 12px;
 +  min-height: 16px; }
 +  .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .background-app-item .close-button StIcon {
 +    icon-size: 1.09em;
 +    -st-icon-style: symbolic; }
 +
 +/* Check Boxes */
 +.check-box StBoxLayout {
 +  spacing: .8em; }
 +
 +.check-box StBin {
 +  width: 24px;
 +  height: 24px;
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-off-light.svg"); }
 +
 +.check-box:focus StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-off-focused-light.svg"); }
 +
 +.check-box:checked StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox.svg"); }
 +
 +.check-box:focus:checked StBin {
 +  background-image: url("resource:///org/gnome/shell/theme/checkbox-focused.svg"); }
 +
 +/* Switches */
 +.toggle-switch {
 +  color: #282828;
 +  height: 26px;
 +  width: 48px;
 +  background-size: contain;
 +  background-image: url("resource:///org/gnome/shell/theme/toggle-off-light.svg"); }
 +  .toggle-switch:checked {
 +    background-image: url("resource:///org/gnome/shell/theme/toggle-on-light.svg"); }
 +
 +/* Slider */
 +.slider {
 +  -barlevel-height: 4px;
 +  -barlevel-background-color: rgba(40, 40, 40, 0.2);
 +  -barlevel-border-width: 2px;
 +  -barlevel-border-color: transparent;
 +  -barlevel-active-background-color: #3584e4;
 +  -barlevel-active-border-color: transparent;
 +  -barlevel-overdrive-color: #c01c28;
 +  -barlevel-overdrive-border-color: transparent;
 +  -barlevel-overdrive-separator-width: 1px;
 +  -slider-handle-radius: 8px;
 +  -slider-handle-border-width: 0;
 +  -slider-handle-border-color: transparent; }
 +
 +/* Scrollbars */
 +StScrollView.vfade {
 +  -st-vfade-offset: 68px; }
 +
 +StScrollView.hfade {
 +  -st-hfade-offset: 68px; }
 +
 +StScrollBar {
 +  padding: 0; }
 +  StScrollView StScrollBar {
 +    min-width: 8px;
 +    min-height: 8px; }
 +  StScrollBar StBin#trough {
 +    border-radius: 0;
 +    background-color: transparent; }
 +  StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
 +    border-radius: 8px;
 +    background-color: #b8b8b7;
 +    border: 3px solid transparent;
 +    transition: 500ms all ease; }
 +    StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
 +      background-color: #8f8f8e; }
 +    StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
 +      background-color: #a4a3a2; }
 +
 +/* Popovers/Menus */
 +.popup-menu-boxpointer, .candidate-popup-boxpointer {
 +  -arrow-rise: 6px; }
 +
 +.popup-menu {
 +  min-width: 15em;
 +  color: #282828; }
 +  .popup-menu.panel-menu {
 +    margin-bottom: 1.75em; }
 +
 +.popup-menu-content, .candidate-popup-content {
 +  padding: 6px;
 +  background-color: #f6f5f4;
 +  border-radius: 20px;
 +  border: 1px solid #e6e3e0;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
 +
 +.popup-menu-item {
 +  font-weight: normal;
 +  spacing: 6px;
 +  transition-duration: 100ms;
 +  padding: 9px 12px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  border-radius: 12px; }
 +  .popup-menu-item:insensitive {
-   .popup-sub-menu .popup-menu-ornament {
-     icon-size: 1.09em !important;
-     width: 1.09em; }
++    background-color: transparent; }
 +  .popup-menu-item:focus, .popup-menu-item:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #dddddd; }
 +  .popup-menu-item:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d6d6d6; }
 +  .popup-menu-item:checked {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecece; }
 +    .popup-menu-item:checked:hover {
 +      background-color: white; }
 +    .popup-menu-item:checked:active {
 +      background-color: white; }
 +  .popup-menu-item:checked {
 +    border-radius: 12px 12px 0 0 !important; }
 +  .popup-menu-item .toggle-switch:ltr {
 +    margin-left: 4px; }
 +  .popup-menu-item .toggle-switch:rtl {
 +    margin-right: 4px; }
 +
++.popup-ornamented-menu-item:ltr {
++  padding-left: 6px; }
++
++.popup-ornamented-menu-item:rtl {
++  padding-right: 6px; }
++
 +.popup-inactive-menu-item {
 +  color: #282828; }
 +  .popup-inactive-menu-item:insensitive {
 +    color: #7a7a7a; }
 +
 +.popup-menu-arrow,
 +.popup-menu-icon {
 +  icon-size: 16px !important; }
 +
 +.popup-sub-menu {
 +  border-radius: 0 0 13px 13px;
 +  margin-bottom: 6px; }
-   .popup-separator-menu-item .popup-menu-ornament {
-     width: 0 !important; }
 +  .popup-sub-menu .popup-menu-item {
 +    border-radius: 0;
 +    font-weight: normal;
 +    spacing: 6px;
 +    transition-duration: 100ms;
 +    padding: 9px 12px;
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #e5e5e5;
 +    border-top-width: 0; }
 +    .popup-sub-menu .popup-menu-item:focus, .popup-sub-menu .popup-menu-item:hover {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #dddddd; }
 +    .popup-sub-menu .popup-menu-item:active {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #d6d6d6; }
 +    .popup-sub-menu .popup-menu-item:checked {
 +      transition-duration: 100ms;
 +      color: #282828;
 +      background-color: #cecece; }
 +      .popup-sub-menu .popup-menu-item:checked:hover {
 +        background-color: white; }
 +      .popup-sub-menu .popup-menu-item:checked:active {
 +        background-color: white; }
 +    .popup-sub-menu .popup-menu-item:last-child {
 +      border-radius: 0 0 12px 12px;
 +      border-bottom-width: 0; }
 +  .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
 +    border-radius: 0; }
 +  .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
 +    border-radius: 0 0 12px 12px; }
 +
 +.popup-menu-ornament {
 +  icon-size: 1.09em !important;
 +  width: 1.09em; }
 +
 +.popup-separator-menu-item {
 +  border: none !important; }
 +  .popup-separator-menu-item .popup-separator-menu-item-separator {
 +    height: 1px;
 +    background-color: rgba(40, 40, 40, 0.15); }
-   .app-menu .popup-menu-ornament {
-     width: 0 !important; }
 +  .popup-sub-menu .popup-separator-menu-item {
 +    background-color: transparent; }
 +    .popup-sub-menu .popup-separator-menu-item:ltr {
 +      margin-right: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item:rtl {
 +      margin-left: 2.5em; }
 +    .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
 +      background-color: rgba(40, 40, 40, 0.15); }
 +
 +.background-menu {
 +  -boxpointer-gap: 0px;
 +  -arrow-rise: 0px; }
 +
 +.app-menu {
 +  max-width: 27.25em; }
-     transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
 +    margin-right: 8px; }
 +  .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
 +    margin-left: 8px; }
 +
 +/* Date/Time Menu */
 +#calendarArea {
 +  padding: 4px; }
 +
 +.datemenu-calendar-column {
 +  spacing: 6px; }
 +  .datemenu-calendar-column:ltr {
 +    padding-left: 6px; }
 +  .datemenu-calendar-column:rtl {
 +    padding-right: 6px; }
 +  .datemenu-calendar-column .datemenu-displays-box {
 +    spacing: 6px; }
 +
 +/* today button (the date) */
 +.datemenu-today-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  padding: 9px; }
 +  .datemenu-today-button:insensitive {
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05);
++    background-color: transparent; }
 +  .datemenu-today-button:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .datemenu-today-button:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .datemenu-today-button:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .datemenu-today-button:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .datemenu-today-button:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .datemenu-today-button:insensitive {
 +    transition-duration: 100ms;
-     transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05);
-     background-color: transparent;
-     color: rgba(255, 255, 255, 0.5); }
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1);
 +    background-color: transparent; }
 +
 +/* Calendar */
 +.calendar {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  background-color: transparent;
 +  background-color: none;
 +  box-shadow: none;
 +  box-shadow: none !important;
 +  margin-top: 0; }
 +  .calendar:insensitive {
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05);
++    background-color: transparent; }
 +  .calendar:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .calendar:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .calendar:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .calendar:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .calendar:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .calendar:insensitive {
 +    transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1);
 +    background-color: transparent; }
 +  .calendar .calendar-month-header .calendar-change-month-back StIcon,
 +  .calendar .calendar-month-header .calendar-change-month-forward StIcon {
 +    icon-size: 1.09em; }
 +  .calendar .calendar-month-header .calendar-month-label {
 +    padding: 8px 0; }
 +  .calendar .calendar-month-header .pager-button {
 +    padding: 0 !important;
 +    height: 32px;
 +    width: 32px;
 +    margin: 2px;
 +    border-radius: 8px;
 +    transition-duration: 100ms; }
 +  .calendar .calendar-day {
 +    border-radius: 99px;
 +    height: 3em !important;
 +    width: 3em !important;
 +    margin: 2px;
 +    padding: 0 !important;
 +    font-weight: 600;
 +    text-align: center;
 +    transition-duration: 100ms; }
 +    .calendar .calendar-day.calendar-day-heading {
 +      background-color: transparent;
 +      color: #7a7a7a;
 +      height: 0.93em !important;
 +      padding-top: 6px !important;
 +      margin-bottom: 0;
 +      border-radius: 9px; }
 +    .calendar .calendar-day.calendar-weekend {
 +      color: #7a7a7a; }
 +    .calendar .calendar-day.calendar-other-month {
 +      color: rgba(122, 122, 122, 0.3) !important;
 +      font-weight: normal; }
 +    .calendar .calendar-day.calendar-day-with-events {
 +      background-image: url("resource:///org/gnome/shell/theme/calendar-today-light.svg");
 +      background-size: contain; }
 +  .calendar .calendar-week-number {
 +    font-size: 7pt;
 +    font-weight: bold;
 +    font-feature-settings: "tnum";
 +    text-align: center;
 +    margin: 6px;
 +    padding: 0 6px;
 +    border-radius: 3px;
 +    background-color: rgba(40, 40, 40, 0.1);
 +    color: #7a7a7a; }
 +
 +/* Events */
 +.events-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc;
 +  padding: 12px; }
 +  .events-button:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .events-button:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .events-button:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .events-button:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .events-button:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .events-button:insensitive {
 +    transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .events-button .events-box {
 +    spacing: 6px; }
 +  .events-button .events-list {
 +    spacing: 12px;
 +    color: #282828; }
 +  .events-button .events-title {
 +    margin-bottom: 4px; }
 +  .events-button .event-time {
 +    color: #7a7a7a; }
 +
 +/* World clocks */
 +.world-clocks-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc;
 +  padding: 12px; }
 +  .world-clocks-button:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .world-clocks-button:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .world-clocks-button:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .world-clocks-button:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .world-clocks-button:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .world-clocks-button:insensitive {
 +    transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .world-clocks-button .world-clocks-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +  .world-clocks-button .world-clocks-header {
 +    color: #7a7a7a; }
 +  .world-clocks-button .world-clocks-city {
 +    color: #282828; }
 +  .world-clocks-button .world-clocks-time {
 +    color: #282828; }
 +    .world-clocks-button .world-clocks-time:ltr {
 +      text-align: right; }
 +    .world-clocks-button .world-clocks-time:rtl {
 +      text-align: left; }
 +  .world-clocks-button .world-clocks-timezone {
 +    color: #7a7a7a; }
 +
 +/* Weather */
 +.weather-button {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc;
 +  padding: 12px; }
 +  .weather-button:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .weather-button:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .weather-button:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .weather-button:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .weather-button:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .weather-button:insensitive {
 +    transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .weather-button .weather-box {
 +    spacing: 10px; }
 +  .weather-button .weather-header-box {
 +    spacing: 6px; }
 +  .weather-button .weather-header {
 +    color: #7a7a7a; }
 +    .weather-button .weather-header.location {
 +      font-weight: normal; }
 +  .weather-button .weather-grid {
 +    spacing-rows: 6px;
 +    spacing-columns: 12px; }
 +  .weather-button .weather-forecast-time {
 +    color: black;
 +    padding-top: 0.2em;
 +    padding-bottom: 0.4em; }
 +  .weather-button .weather-forecast-icon {
 +    icon-size: 2.18em; }
 +
 +/* Message List */
 +.message-list {
 +  width: 29em;
 +  border: solid rgba(40, 40, 40, 0.15); }
 +  .message-list:ltr {
 +    margin-left: 0;
 +    margin-right: 4px;
 +    padding-right: 6px;
 +    border-right-width: 1px; }
 +  .message-list:rtl {
 +    margin-right: 0;
 +    margin-left: 4px;
 +    padding-left: 6px;
 +    border-left-width: 1px; }
 +  .message-list .message-list-placeholder {
 +    color: #7a7a7a; }
 +    .message-list .message-list-placeholder > StIcon {
 +      icon-size: 3.27em;
 +      margin-bottom: 12px;
 +      -st-icon-style: symbolic; }
 +
 +.message-list-sections {
 +  spacing: 6px;
 +  margin: 0;
 +  padding-bottom: 6px; }
 +  .message-list-sections:ltr {
 +    margin-right: 12px; }
 +  .message-list-sections:rtl {
 +    margin-left: 12px; }
 +
 +.message-list-section,
 +.message-list-section-list {
 +  spacing: 6px; }
 +
 +.message-list-controls {
 +  padding: 6px;
 +  spacing: 6px; }
 +  .message-list-controls .dnd-button {
 +    border-width: 2px;
 +    border-color: transparent;
 +    border-radius: 32px;
 +    border-style: solid; }
 +    .message-list-controls .dnd-button:focus {
 +      border-color: rgba(53, 132, 228, 0.6); }
 +
 +.message {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc; }
 +  .message:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .message:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .message:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .message:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .message:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .message:insensitive {
 +    transition-duration: 100ms;
-   border-radius: 12px;
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .message .message-icon-bin {
 +    padding: 18px; }
 +    .message .message-icon-bin:ltr {
 +      padding-right: 6px; }
 +    .message .message-icon-bin:rtl {
 +      padding-left: 6px; }
 +    .message .message-icon-bin > StIcon {
 +      icon-size: 2.18em;
 +      -st-icon-style: symbolic; }
 +    .message .message-icon-bin > .fallback-app-icon {
 +      width: 1.09em;
 +      height: 1.09em; }
 +  .message .message-content {
 +    spacing: 4px;
 +    padding: 9px;
 +    margin-bottom: 8px; }
 +  .message .message-title {
 +    font-weight: bold;
 +    /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
 +    padding-top: 0.57em; }
 +  .message .message-secondary-bin {
 +    padding: 0 8px; }
 +    .message .message-secondary-bin > .event-time {
 +      color: rgba(40, 40, 40, 0.5);
 +      font-size: 9pt;
 +      /* HACK: the label should be baseline-aligned with a 1em label, fake this with some bottom padding */
 +      padding-bottom: 0.13em; }
 +      .message .message-secondary-bin > .event-time:ltr {
 +        text-align: right; }
 +      .message .message-secondary-bin > .event-time:rtl {
 +        text-align: left; }
 +  .message .message-close-button {
 +    color: #282828;
 +    background-color: rgba(40, 40, 40, 0.2);
 +    border-radius: 99px;
 +    padding: 5px;
 +    margin: 1px; }
 +    .message .message-close-button:hover {
 +      background-color: rgba(40, 40, 40, 0.3); }
 +    .message .message-close-button:active {
 +      background-color: rgba(40, 40, 40, 0.2); }
 +    .message .message-close-button > StIcon {
 +      icon-size: 1.09em; }
 +  .message .message-body {
 +    color: #0f0f0f; }
 +
 +.url-highlighter {
 +  link-color: #1b6acb; }
 +
 +/* Media Controls */
 +.message-media-control {
 +  padding: 0 18px;
 +  margin: 12px 0;
 +  border-radius: 8px;
 +  color: #282828; }
 +  .message-media-control:hover {
 +    background-color: #edebe9;
 +    color: #282828; }
 +  .message-media-control:active {
 +    background-color: #e8e6e3;
 +    color: #282828; }
 +  .message-media-control:insensitive {
 +    color: #878787; }
 +  .message-media-control:last-child:ltr {
 +    margin-right: 12px; }
 +  .message-media-control:last-child:rtl {
 +    margin-left: 12px; }
 +  .message-media-control StIcon {
 +    icon-size: 1.09em; }
 +
 +.media-message-cover-icon {
 +  icon-size: 3.27em !important;
 +  border-radius: 8px; }
 +  .media-message-cover-icon.fallback {
 +    color: black;
 +    background-color: #f6f5f4;
 +    border: 1px solid transparent;
 +    border-radius: 8px;
 +    icon-size: 2.18em !important;
 +    padding: 14px; }
 +
 +.candidate-popup-content {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +.candidate-index {
 +  padding: 0;
 +  padding-right: 6px;
 +  color: #7a7a7a; }
 +
 +.candidate-box {
 +  padding: 6px 12px 6px 12px;
 +  border-radius: 8px; }
 +  .candidate-box:selected {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +  .candidate-box:hover {
 +    background-color: #e1dedb;
 +    color: #111111; }
 +
 +.candidate-page-button-box {
 +  height: 2em; }
 +  .vertical .candidate-page-button-box {
 +    padding-top: 12px; }
 +  .horizontal .candidate-page-button-box {
 +    padding-left: 12px; }
 +
 +.candidate-page-button {
 +  padding: 6px; }
 +  .candidate-page-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.candidate-page-button-previous {
 +  border-radius: 8px 0px 0px 8px;
 +  border-right-width: 0;
 +  box-shadow: none; }
 +
 +.candidate-page-button-next {
 +  border-radius: 0px 8px 8px 0px;
 +  box-shadow: none; }
 +
 +/* Notifications & Message Tray */
 +.notification-banner {
 +  min-height: 64px;
 +  width: 34em;
 +  box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.05);
-     -barlevel-background-color: rgba(40, 40, 40, 0.3);
-     -barlevel-active-background-color: #282828;
++  border-radius: 16px;
 +  margin: 4px; }
 +  .notification-banner .notification-actions {
 +    spacing: 0; }
 +
 +.summary-source-counter {
 +  font-size: 10pt;
 +  font-weight: bold;
 +  height: 1.6em;
 +  width: 1.6em;
 +  -shell-counter-overlap-x: 3px;
 +  -shell-counter-overlap-y: 3px;
 +  background-color: #3584e4;
 +  color: #ffffff;
 +  border: 2px solid #282828;
 +  box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
 +  border-radius: 0.9em; }
 +
 +.chat-body {
 +  spacing: 5px; }
 +
 +.chat-response {
 +  margin: 5px; }
 +
 +.chat-log-message {
 +  color: #0f0f0f; }
 +
 +.chat-new-group {
 +  padding-top: 1em; }
 +
 +.chat-received {
 +  padding-left: 4px; }
 +  .chat-received:rtl {
 +    padding-left: 0px;
 +    padding-right: 4px; }
 +
 +.chat-sent {
 +  padding-left: 18pt;
 +  color: #4e4e4e; }
 +  .chat-sent:rtl {
 +    padding-left: 0;
 +    padding-right: 18pt; }
 +
 +.chat-meta-message {
 +  padding-left: 4px;
 +  font-size: 9pt;
 +  font-weight: bold;
 +  color: #565656; }
 +  .chat-meta-message:rtl {
 +    padding-left: 0;
 +    padding-right: 4px; }
 +
 +.hotplug-notification-item-icon {
 +  icon-size: 24px;
 +  padding: 0 4px; }
 +
 +/* Modal Dialogs */
 +.modal-dialog {
 +  background-color: #f6f5f4;
 +  border-radius: 16px;
 +  box-shadow: inset 0 0 0 1px #e6e3e0; }
 +  .modal-dialog .modal-dialog-content-box {
 +    margin: 32px 40px;
 +    spacing: 32px;
 +    max-width: 28em; }
 +
 +/* End Session Dialog */
 +.end-session-dialog {
 +  width: 30em; }
 +  .end-session-dialog .end-session-dialog-battery-warning,
 +  .end-session-dialog .dialog-list-title {
 +    color: #f5c211; }
 +
 +/* Message Dialog */
 +.message-dialog-content {
 +  spacing: 18px; }
 +  .message-dialog-content .message-dialog-title {
 +    text-align: center; }
 +  .message-dialog-content .message-dialog-description {
 +    text-align: center; }
 +
 +/* Dialog List */
 +.dialog-list {
 +  spacing: 18px; }
 +  .dialog-list .dialog-list-title {
 +    text-align: center; }
 +  .dialog-list .dialog-list-scrollview {
 +    max-height: 200px; }
 +  .dialog-list .dialog-list-box {
 +    spacing: 1em; }
 +    .dialog-list .dialog-list-box .dialog-list-item {
 +      spacing: 1em; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
 +        font-weight: bold; }
 +      .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
 +        color: #1b1b1b; }
 +
 +/* Run Dialog */
 +.run-dialog .modal-dialog-content-box {
 +  margin-top: 24px;
 +  margin-bottom: 14px; }
 +
 +.run-dialog .run-dialog-entry {
 +  width: 20em; }
 +
 +.run-dialog .run-dialog-description {
 +  text-align: center;
 +  color: black; }
 +
 +/* Password or Authentication Dialog */
 +.prompt-dialog {
 +  width: 28em; }
 +  .prompt-dialog .modal-dialog-content-box {
 +    margin-bottom: 24px; }
 +
 +.prompt-dialog-password-grid {
 +  spacing-rows: 8px;
 +  spacing-columns: 4px; }
 +  .prompt-dialog-password-grid .prompt-dialog-password-entry {
 +    width: auto; }
 +    .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
 +      margin-left: 20px; }
 +    .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
 +      margin-right: 20px; }
 +
 +.prompt-dialog-password-layout {
 +  spacing: 8px; }
 +
 +.prompt-dialog-password-entry {
 +  width: 20em; }
 +
 +.prompt-dialog-error-label,
 +.prompt-dialog-info-label,
 +.prompt-dialog-null-label {
 +  text-align: center; }
 +
 +.prompt-dialog-error-label {
 +  color: #f5c211; }
 +
 +/* Polkit Dialog */
 +.polkit-dialog-user-layout {
 +  text-align: center;
 +  spacing: 8px;
 +  margin-bottom: 6px; }
 +  .polkit-dialog-user-layout .polkit-dialog-user-root-label {
 +    color: #f5c211; }
 +
 +/* Audio selection dialog */
 +.audio-device-selection-dialog .modal-dialog-content-box {
 +  margin-bottom: 28px; }
 +
 +.audio-device-selection-dialog .audio-selection-box {
 +  spacing: 20px; }
 +
 +.audio-selection-device {
 +  border-radius: 16px; }
 +  .audio-selection-device:hover, .audio-selection-device:focus {
 +    background-color: #e1dedb; }
 +  .audio-selection-device:active {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +
 +.audio-selection-device-box {
 +  padding: 20px;
 +  spacing: 20px; }
 +
 +.audio-selection-device-icon {
 +  icon-size: 4.36em; }
 +
 +/* Welcome dialog */
 +.welcome-dialog-image {
 +  background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
 +  background-size: contain;
 +  /* Reasonable maximum dimensions */
 +  height: 300px;
 +  width: 300px; }
 +
 +/* Access portal dialog */
 +.access-dialog {
 +  text-align: center; }
 +
 +/* OSD */
 +.osd-window {
 +  text-align: center;
 +  font-weight: bold;
 +  spacing: 12px;
 +  padding: 12px 18px;
 +  margin-bottom: 4em; }
 +  .osd-window > * {
 +    spacing: 8px; }
 +  .osd-window StIcon {
 +    icon-size: 2.18em; }
 +  .osd-window StLabel:ltr {
 +    margin-right: 6px; }
 +  .osd-window StLabel:rtl {
 +    margin-left: 6px; }
 +  .osd-window .level {
 +    margin-bottom: 4px;
 +    height: 6px;
 +    min-width: 10.9em;
 +    -barlevel-height: 6px;
-       background-color: rgba(40, 40, 40, 0.1); }
++    -barlevel-background-color: rgba(255, 255, 255, 0.3);
++    -barlevel-active-background-color: #ffffff;
 +    -barlevel-overdrive-color: #c01c28;
 +    -barlevel-overdrive-separator-width: 3px; }
 +    .osd-window .level:first-child {
 +      margin-bottom: 0px; }
 +    .osd-window .level:ltr {
 +      margin-right: 6px; }
 +    .osd-window .level:rtl {
 +      margin-left: 6px; }
 +
 +.osd-monitor-label {
 +  border-radius: 16px;
 +  font-size: 3em;
 +  font-weight: bold;
 +  margin: 12px;
 +  text-align: center;
 +  min-width: 1.3em; }
 +
 +/* Pad OSD */
 +.pad-osd-window {
 +  padding: 32px;
 +  background-color: rgba(0, 0, 0, 0.8); }
 +  .pad-osd-window .pad-osd-title-box {
 +    spacing: 12px; }
 +  .pad-osd-window .pad-osd-title-menu-box {
 +    spacing: 6px; }
 +
 +.combo-box-label {
 +  width: 15em; }
 +
 +/* App Switcher */
 +.switcher-popup {
 +  padding: 0;
 +  spacing: 24px; }
 +
 +.switcher-list {
 +  padding: 12px;
 +  border-radius: 28px;
 +  box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.05); }
 +  .switcher-list .switcher-list-item-container {
 +    spacing: 12px; }
 +  .switcher-list .item-box {
 +    background-color: transparent; }
 +    .switcher-list .item-box:hover {
-       background-color: rgba(40, 40, 40, 0.13); }
++      background-color: rgba(255, 255, 255, 0.1); }
 +    .switcher-list .item-box:selected, .switcher-list .item-box:focus {
-         background-color: rgba(40, 40, 40, 0.16); }
++      background-color: rgba(255, 255, 255, 0.13); }
 +      .switcher-list .item-box:selected:hover, .switcher-list .item-box:focus:hover {
-         background-color: rgba(40, 40, 40, 0.13); }
++        background-color: rgba(255, 255, 255, 0.16); }
 +      .switcher-list .item-box:selected:active, .switcher-list .item-box:focus:active {
-       background-color: rgba(40, 40, 40, 0.16); }
++        background-color: rgba(255, 255, 255, 0.13); }
 +    .switcher-list .item-box:active {
-       background-color: rgba(40, 40, 40, 0.19); }
++      background-color: rgba(255, 255, 255, 0.16); }
 +    .switcher-list .item-box:outlined, .switcher-list .item-box:checked {
-         background-color: rgba(40, 40, 40, 0.22); }
++      background-color: rgba(255, 255, 255, 0.19); }
 +      .switcher-list .item-box:outlined:active, .switcher-list .item-box:checked:active {
-         background-color: rgba(40, 40, 40, 0.25); }
++        background-color: rgba(255, 255, 255, 0.22); }
 +      .switcher-list .item-box:outlined:hover, .switcher-list .item-box:checked:hover {
-   border-color: rgba(40, 40, 40, 0.8);
-   color: rgba(40, 40, 40, 0.8); }
++        background-color: rgba(255, 255, 255, 0.25); }
 +    .switcher-list .item-box:drop {
 +      border: 2px solid rgba(53, 132, 228, 0.8);
 +      background-color: rgba(53, 132, 228, 0.2); }
 +    .switcher-list .item-box:hover {
 +      background: none; }
 +  .switcher-list .separator {
 +    width: 1px;
 +    background: rgba(40, 40, 40, 0.15); }
 +  .switcher-list .thumbnail-box {
 +    padding: 2px;
 +    spacing: 6px; }
 +  .switcher-list .thumbnail {
 +    width: 256px;
 +    border-radius: 8px; }
 +
 +.switcher-arrow {
-     border-color: #282828;
-     color: #282828; }
++  border-color: rgba(255, 255, 255, 0.8);
++  color: rgba(255, 255, 255, 0.8); }
 +  .switcher-arrow:highlighted {
-   background-color: rgba(40, 40, 40, 0.5);
++    border-color: #ffffff;
++    color: #ffffff; }
 +
 +.input-source-switcher-symbol {
 +  font-size: 34pt;
 +  width: 96px;
 +  height: 96px; }
 +
 +.cycler-highlight {
 +  border: 5px solid #3584e4; }
 +
 +/* Workspace Switcher */
 +.workspace-switcher {
 +  margin-bottom: 4em;
 +  spacing: 12px;
 +  padding: 12px 18px; }
 +
 +.ws-switcher-indicator {
-     background-color: #282828;
++  background-color: rgba(255, 255, 255, 0.5);
 +  padding: 0.1816666667em;
 +  margin: 0.9083333333em;
 +  border-radius: 2.18em; }
 +  .ws-switcher-indicator:active {
-   border: 4px #282828;
++    background-color: #ffffff;
 +    padding: 0.3633333333em;
 +    margin: 0.7266666667em; }
 +
 +.icon-label-button-container {
 +  spacing: 6px; }
 +  .icon-label-button-container StIcon {
 +    icon-size: 32px; }
 +
 +.screenshot-ui-panel {
 +  border-radius: 37px;
 +  padding: 18px;
 +  padding-bottom: 12px;
 +  margin-bottom: 4em;
 +  spacing: 12px; }
 +
 +.screenshot-ui-close-button {
 +  padding: 6px !important;
 +  margin-top: 12px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
 +  .screenshot-ui-close-button.left {
 +    margin-left: 12px; }
 +  .screenshot-ui-close-button.right {
 +    margin-right: 12px; }
 +
 +.screenshot-ui-type-button {
 +  min-width: 48px;
 +  padding: 12px 18px !important;
 +  border-radius: 19px; }
 +
 +.screenshot-ui-capture-button {
 +  width: 36px;
 +  height: 36px;
 +  border-radius: 99px;
-     background-color: #282828;
++  border: 4px #ffffff;
 +  padding: 4px; }
 +  .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
-     background-color: #020202; }
++    background-color: #ffffff;
 +    transition-duration: 200ms;
 +    border-radius: 99px; }
 +    .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
 +      background-color: #e1dedb; }
 +  .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
-     background-color: black; }
++    background-color: #d9d9d9; }
 +  .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
-   background-color: #eae9e7;
++    background-color: gray; }
 +  .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
 +    background-color: #c01c28; }
 +  .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
 +    background-color: #d61f2d; }
 +  .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
 +    background-color: #a11722; }
 +
 +.screenshot-ui-shot-cast-container {
-     background-color: #f6f6f5; }
++  background-color: rgba(255, 255, 255, 0.1);
 +  border-radius: 16px;
 +  padding: 3px;
 +  spacing: 3px; }
 +  .screenshot-ui-shot-cast-container:ltr {
 +    margin-left: 3px; }
 +  .screenshot-ui-shot-cast-container:rtl {
 +    margin-right: 3px; }
 +
 +.screenshot-ui-shot-cast-button {
 +  padding: 6px 12px;
 +  background-color: transparent;
 +  border-radius: 13px; }
 +  .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
-     background-color: #e8e6e3; }
++    background-color: rgba(255, 255, 255, 0.2); }
 +  .screenshot-ui-shot-cast-button:active {
-     background-color: white;
-     color: black; }
++    background-color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button:checked {
-     color: rgba(40, 40, 40, 0.5); }
++    background-color: #ffffff;
++    color: #353535; }
 +  .screenshot-ui-shot-cast-button:insensitive {
-   #panel.unlock-screen, #panel.login-screen, #panel:overview {
-     background-color: transparent;
-     box-shadow: none; }
-     #panel.unlock-screen .panel-button, #panel.login-screen .panel-button, #panel:overview .panel-button {
-       transition-duration: 150ms;
-       border: 3px solid transparent;
-       border-radius: 99px;
-       font-weight: bold;
-       background-color: transparent;
-       color: #282828;
-       box-shadow: none; }
-       #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:overview, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:overview, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:active, #panel:overview .panel-button:overview, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
-         box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
-         #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:overview:hover, #panel.unlock-screen .panel-button:focus:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:overview:hover, #panel.login-screen .panel-button:focus:hover, #panel.login-screen .panel-button:checked:hover, #panel:overview .panel-button:active:hover, #panel:overview .panel-button:overview:hover, #panel:overview .panel-button:focus:hover, #panel:overview .panel-button:checked:hover {
-           box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); }
-       #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:hover, #panel:overview .panel-button:hover {
-         box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++    color: rgba(255, 255, 255, 0.5); }
 +  .screenshot-ui-shot-cast-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.screenshot-ui-show-pointer-button {
 +  border-radius: 99px;
 +  padding: 12px !important; }
 +  .screenshot-ui-show-pointer-button StIcon {
 +    icon-size: 1.09em; }
 +
 +.screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.3); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
 +  background-color: rgba(0, 0, 0, 0.5); }
 +
 +.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
 +  border: 2px white; }
 +
 +.screenshot-ui-area-selector-handle {
 +  border-radius: 99px;
 +  background-color: white;
 +  box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.05);
 +  width: 24px;
 +  height: 24px; }
 +
 +.screenshot-ui-window-selector {
 +  background-color: #353535; }
 +  .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
 +    margin: 100px; }
 +  .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
 +    margin-bottom: 200px; }
 +
 +.screenshot-ui-window-selector-window-border {
 +  transition-duration: 200ms;
 +  border-radius: 16px;
 +  border: 6px transparent; }
 +
 +.screenshot-ui-window-selector-check {
 +  transition-duration: 200ms;
 +  color: transparent;
 +  border-radius: 99px;
 +  border-width: 12px;
 +  icon-size: 24px; }
 +
 +.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
 +  border-color: #185fb4; }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
 +  border-color: #3584e4;
 +  background-color: rgba(53, 132, 228, 0.2); }
 +
 +.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
 +  color: #ffffff;
 +  background-color: #3584e4; }
 +
 +.screenshot-ui-screen-selector {
 +  transition-duration: 200ms;
 +  background-color: rgba(0, 0, 0, 0.5); }
 +  .screenshot-ui-screen-selector:hover {
 +    background-color: rgba(0, 0, 0, 0.3); }
 +  .screenshot-ui-screen-selector:active {
 +    background-color: rgba(0, 0, 0, 0.7); }
 +  .screenshot-ui-screen-selector:checked {
 +    background-color: transparent;
 +    border: 2px white; }
 +
 +.screenshot-ui-tooltip {
 +  text-align: center;
 +  -y-offset: 24px; }
 +
 +/* Top Bar */
 +#panel {
 +  background-color: #deddda;
 +  font-weight: bold;
 +  height: 2.2em;
 +  transition-duration: 250ms;
 +  box-shadow: inset 0 -1px 0 0 #d9d8d5; }
-     #panel .panel-button:active, #panel .panel-button:overview, #panel .panel-button:focus, #panel .panel-button:checked {
 +  #panel .panel-button {
 +    transition-duration: 150ms;
 +    border: 3px solid transparent;
 +    border-radius: 99px;
 +    font-weight: bold;
 +    background-color: transparent;
 +    color: #282828;
 +    box-shadow: none;
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 6px; }
-       #panel .panel-button:active:hover, #panel .panel-button:overview:hover, #panel .panel-button:focus:hover, #panel .panel-button:checked:hover {
++    #panel .panel-button:active, #panel .panel-button:focus, #panel .panel-button:checked {
 +      box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.25); }
-       #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:overview, #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:checked {
++      #panel .panel-button:active:hover, #panel .panel-button:focus:hover, #panel .panel-button:checked:hover {
 +        box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.35); }
 +    #panel .panel-button:hover {
 +      box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.2); }
 +    #panel .panel-button .system-status-icon {
 +      icon-size: 1.09em;
 +      padding: 5px;
 +      margin: 0 4px; }
 +    #panel .panel-button .panel-status-indicators-box .system-status-icon,
 +    #panel .panel-button .panel-status-menu-box .system-status-icon {
 +      margin: 0; }
 +    #panel .panel-button .app-menu-icon {
 +      -st-icon-style: symbolic; }
 +    #panel #panelActivities.panel-button {
 +      -natural-hpadding: 18px; }
 +    #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
 +      spacing: 6px; }
 +    #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
 +      icon-size: 1.09em; }
 +    #panel .panel-button.screen-recording-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
 +      color: #282828;
 +      box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.8); }
-         #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:overview:hover, #panel .panel-button.screen-recording-indicator:focus:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
++      #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:checked {
 +        box-shadow: inset 0 0 0 100px #c01c28; }
-       color: rgba(0, 0, 0, 0.8);
-       box-shadow: inset 0 0 0 100px rgba(245, 194, 17, 0.8); }
-       #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:overview, #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:checked {
-         box-shadow: inset 0 0 0 100px #f5c211; }
-         #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:overview:hover, #panel .panel-button.screen-sharing-indicator:focus:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
-           box-shadow: inset 0 0 0 100px rgba(245, 194, 17, 0.95); }
++        #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:focus:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.95); }
 +      #panel .panel-button.screen-recording-indicator:hover {
 +        box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.9); }
 +    #panel .panel-button.screen-sharing-indicator {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
-         box-shadow: inset 0 0 0 100px rgba(245, 194, 17, 0.9); }
++      color: #282828;
++      box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.8); }
++      #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:checked {
++        box-shadow: inset 0 0 0 100px #ff7800; }
++        #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:focus:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
++          box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.95); }
 +      #panel .panel-button.screen-sharing-indicator:hover {
-       #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
++        box-shadow: inset 0 0 0 100px rgba(255, 120, 0, 0.9); }
 +    #panel .panel-button.clock-display {
 +      transition-duration: 150ms;
 +      border: 3px solid transparent;
 +      border-radius: 99px;
 +      font-weight: bold;
 +      background-color: transparent;
 +      color: #282828;
 +      box-shadow: none;
 +      box-shadow: none !important; }
-         #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:overview:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
++      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
 +        box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.25); }
-       #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:overview, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
++        #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
 +          box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.35); }
 +      #panel .panel-button.clock-display:hover {
 +        box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.2); }
 +      #panel .panel-button.clock-display .clock {
 +        transition-duration: 150ms;
 +        border: 3px solid transparent;
 +        border-radius: 99px; }
-         #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:overview .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
++      #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:checked {
 +        box-shadow: none !important; }
-         #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:overview:hover, #panel .panel-button.clock-display:focus:hover, #panel .panel-button.clock-display:checked:hover {
-           box-shadow: none !important; }
-           #panel .panel-button.clock-display:active:hover .clock, #panel .panel-button.clock-display:overview:hover .clock, #panel .panel-button.clock-display:focus:hover .clock, #panel .panel-button.clock-display:checked:hover .clock {
-             box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.35); }
++        #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:checked .clock {
 +          box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.25); }
-   #panel .screencast-indicator,
-   #panel .remote-access-indicator {
-     color: #f5c211; }
++          #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:focus .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
++            box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.35) !important; }
 +      #panel .panel-button.clock-display:hover {
 +        box-shadow: none !important; }
 +        #panel .panel-button.clock-display:hover .clock {
 +          box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.2); }
++  #panel.unlock-screen, #panel.login-screen, #panel:overview {
++    background-color: transparent;
++    box-shadow: none; }
++    #panel.unlock-screen .panel-button, #panel.login-screen .panel-button, #panel:overview .panel-button {
++      transition-duration: 150ms;
++      border: 3px solid transparent;
++      border-radius: 99px;
++      font-weight: bold;
++      background-color: transparent;
++      color: #f6f5f4;
++      box-shadow: none; }
++      #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:checked, #panel:overview .panel-button:active, #panel:overview .panel-button:focus, #panel:overview .panel-button:checked {
++        box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
++        #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:focus:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:focus:hover, #panel.login-screen .panel-button:checked:hover, #panel:overview .panel-button:active:hover, #panel:overview .panel-button:focus:hover, #panel:overview .panel-button:checked:hover {
++          box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); }
++      #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:hover, #panel:overview .panel-button:hover {
++        box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++      #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display, #panel:overview .panel-button.clock-display {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: #f6f5f4;
++        box-shadow: none;
++        box-shadow: none !important; }
++        #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
++          box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
++          #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:focus:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:focus:hover, #panel.login-screen .panel-button.clock-display:checked:hover, #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:focus:hover, #panel:overview .panel-button.clock-display:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35); }
++        #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:hover {
++          box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++        #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock, #panel:overview .panel-button.clock-display .clock {
++          transition-duration: 150ms;
++          border: 3px solid transparent;
++          border-radius: 99px; }
++        #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:checked, #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:checked {
++          box-shadow: none !important; }
++          #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:checked .clock, #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:checked .clock {
++            box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.25); }
++            #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:focus .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:focus .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover, #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:focus .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
++              box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.35) !important; }
++        #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:hover, #panel:overview .panel-button.clock-display:hover {
++          box-shadow: none !important; }
++          #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:hover .clock, #panel:overview .panel-button.clock-display:hover .clock {
++            box-shadow: inset 0 0 0 100px rgba(246, 245, 244, 0.2); }
++      #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator, #panel:overview .panel-button.screen-recording-indicator {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: #282828;
++        box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.8); }
++        #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:checked, #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:checked {
++          box-shadow: inset 0 0 0 100px #c01c28; }
++          #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover, #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:focus:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.95); }
++        #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:hover, #panel:overview .panel-button.screen-recording-indicator:hover {
++          box-shadow: inset 0 0 0 100px rgba(192, 28, 40, 0.9); }
++      #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator, #panel:overview .panel-button.screen-sharing-indicator {
++        transition-duration: 150ms;
++        border: 3px solid transparent;
++        border-radius: 99px;
++        font-weight: bold;
++        background-color: transparent;
++        color: rgba(0, 0, 0, 0.8);
++        box-shadow: inset 0 0 0 100px rgba(245, 194, 17, 0.8); }
++        #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:checked, #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:checked {
++          box-shadow: inset 0 0 0 100px #f5c211; }
++          #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover, #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:focus:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover {
++            box-shadow: inset 0 0 0 100px rgba(245, 194, 17, 0.95); }
++        #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:hover, #panel:overview .panel-button.screen-sharing-indicator:hover {
++          box-shadow: inset 0 0 0 100px rgba(245, 194, 17, 0.9); }
 +  #panel .panel-status-indicators-box,
 +  #panel .panel-status-menu-box {
 +    spacing: 2px; }
 +  #panel .power-status.panel-status-indicators-box {
 +    spacing: 0; }
-       color: rgba(40, 40, 40, 0.5);
-       background-color: rgba(40, 40, 40, 0.05);
++  #panel .privacy-indicator {
++    color: #ff7800; }
 +
 +#appMenu {
 +  spacing: 6px; }
 +  #appMenu .label-shadow {
 +    color: transparent; }
 +
 +#appMenu .panel-status-menu-box {
 +  padding: 0 6px;
 +  spacing: 6px; }
 +
 +.clock-display-box {
 +  spacing: 2px; }
 +  .clock-display-box .clock {
 +    padding-left: 12px;
 +    padding-right: 12px; }
 +
 +/* Activities Ripple */
 +.ripple-box {
 +  background-color: rgba(255, 255, 255, 0.2);
 +  box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
 +  width: 52px;
 +  height: 52px;
 +  border-radius: 0 0 52px 0; }
 +  .ripple-box:rtl {
 +    border-radius: 0 0 0 52px; }
 +
 +.quick-settings {
 +  padding: 18px;
 +  border-radius: 36px; }
 +  .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .background-app-item .close-button, .background-app-item .quick-settings .close-button, .quick-settings .button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .calendar .calendar-day, .calendar .quick-settings .calendar-day {
 +    padding: 10.5px; }
 +
 +.quick-settings-grid {
 +  spacing-rows: 12px;
 +  spacing-columns: 12px; }
 +
 +.quick-toggle, .quick-menu-toggle {
 +  border-radius: 99px;
 +  min-width: 12em;
 +  max-width: 12em;
 +  min-height: 48px;
 +  border: none; }
 +
 +.quick-toggle {
 +  /* Move padding into the box; this is to allow menu arrows
 +     to extend to the border */ }
 +  .quick-toggle:checked {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +    .quick-toggle:checked:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .quick-toggle:checked:hover, .quick-toggle:checked:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .quick-toggle:checked:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .quick-toggle:checked:insensitive {
 +      transition-duration: 100ms;
-   border-width: 0; }
++      color: rgba(40, 40, 40, 0.4);
++      background-color: rgba(40, 40, 40, 0.1);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .quick-toggle > StBoxLayout {
 +    spacing: 9px; }
 +  .quick-toggle.button, .quick-toggle.icon-button, .quick-toggle.login-dialog-button.cancel-button, .quick-toggle.login-dialog-button.switch-user-button, .quick-toggle.login-dialog-button.login-dialog-session-list-button, .background-app-item .quick-toggle.close-button, .calendar .calendar-month-header .quick-toggle.pager-button, .calendar .quick-toggle.calendar-day {
 +    padding: 0; }
 +  .quick-toggle > StBoxLayout {
 +    padding: 0 12px; }
 +  .quick-toggle:ltr > StBoxLayout {
 +    padding-left: 15px; }
 +  .quick-toggle:rtl > StBoxLayout {
 +    padding-right: 15px; }
 +  .quick-toggle .quick-toggle-title {
 +    font-weight: bold; }
 +  .quick-toggle StBoxLayout > .quick-toggle-subtitle {
 +    font-weight: normal;
 +    font-size: 12px; }
 +  .quick-toggle .quick-toggle-icon {
 +    icon-size: 1.09em; }
 +
 +.quick-menu-toggle .quick-toggle {
 +  min-width: auto;
 +  max-width: auto; }
 +  .quick-menu-toggle .quick-toggle:ltr {
 +    border-radius: 99px 0 0 99px; }
 +  .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
 +    padding-right: 9px; }
 +  .quick-menu-toggle .quick-toggle:rtl {
 +    border-radius: 0 99px 99px 0; }
 +  .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
 +    padding-left: 9px; }
 +  .quick-menu-toggle .quick-toggle:ltr:last-child {
 +    border-radius: 99px; }
 +  .quick-menu-toggle .quick-toggle:rtl:last-child {
 +    border-radius: 99px; }
 +
 +.quick-menu-toggle .quick-toggle-arrow {
 +  padding: 6px 10.5px;
-       color: rgba(40, 40, 40, 0.5);
-       background-color: rgba(40, 40, 40, 0.05);
++  border-width: 0;
++  border-color: rgba(40, 40, 40, 0.25); }
 +  .quick-menu-toggle .quick-toggle-arrow:checked {
 +    transition-duration: 100ms;
 +    background-color: #3584e4;
 +    color: #ffffff;
 +    border-color: #185fb4; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:focus {
 +      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:hover, .quick-menu-toggle .quick-toggle-arrow:checked:focus {
 +      background-color: #4b92e7;
 +      color: white; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:active {
 +      background-color: #1d72d8;
 +      color: #ededed; }
 +    .quick-menu-toggle .quick-toggle-arrow:checked:insensitive {
 +      transition-duration: 100ms;
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++      color: rgba(40, 40, 40, 0.4);
++      background-color: rgba(40, 40, 40, 0.1);
 +      background-color: rgba(53, 132, 228, 0.5);
 +      color: rgba(255, 255, 255, 0.5); }
 +  .quick-menu-toggle .quick-toggle-arrow:ltr {
 +    border-radius: 0 99px 99px 0;
 +    border-left-width: 1px; }
 +  .quick-menu-toggle .quick-toggle-arrow:rtl {
 +    border-radius: 99px 0 0 99px;
 +    border-right-width: 1px; }
 +
 +.quick-slider > StBoxLayout {
 +  spacing: 6px; }
 +
 +.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .background-app-item .close-button, .background-app-item .quick-slider .close-button {
 +  padding: 6px; }
 +
 +.quick-slider .slider-bin {
 +  min-height: 16px;
 +  padding: 6px;
 +  border-radius: 99px; }
 +  .quick-slider .slider-bin:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .quick-slider .slider-bin:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .quick-slider .slider-bin:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +
 +.quick-toggle-menu {
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc;
 +  background-color: #f6f5f4 !important;
 +  color: #282828 !important;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 12px 18px 0; }
 +  .quick-toggle-menu:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .quick-toggle-menu:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .quick-toggle-menu:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .quick-toggle-menu:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .quick-toggle-menu:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .quick-toggle-menu:insensitive {
 +    transition-duration: 100ms;
-   background-color: #f6f5f4;
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +  .quick-toggle-menu .popup-menu-item > StIcon {
 +    -st-icon-style: symbolic; }
 +  .quick-toggle-menu .header {
 +    spacing-rows: 3px;
 +    spacing-columns: 12px;
 +    padding-bottom: 12px; }
 +    .quick-toggle-menu .header .icon {
 +      icon-size: 1.635em;
 +      border-radius: 999px;
 +      padding: 9px;
 +      background-color: rgba(40, 40, 40, 0.2); }
 +      .quick-toggle-menu .header .icon.active {
 +        background-color: #3584e4;
 +        color: #ffffff; }
 +
 +.quick-settings-system-item > StBoxLayout {
 +  spacing: 12px; }
 +
 +.quick-settings-system-item .power-item {
 +  min-height: 0;
 +  min-width: 0; }
 +  .quick-settings-system-item .power-item:insensitive {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #dddcdc;
 +    background-color: transparent; }
 +
 +.nm-network-item .wireless-secure-icon {
 +  icon-size: 0.545em; }
 +
 +.bt-device-item .popup-menu-icon {
 +  -st-icon-style: symbolic; }
 +
 +.bt-menu-placeholder.popup-menu-item {
 +  text-align: center;
 +  padding: 2em 4em; }
 +
 +.device-subtitle {
 +  color: rgba(40, 40, 40, 0.5); }
 +
++.keyboard-brightness-item .slider {
++  min-height: 16px; }
++
++.keyboard-brightness-level {
++  spacing: 6px; }
++  .keyboard-brightness-level .button:checked, .keyboard-brightness-level .icon-button:checked, .keyboard-brightness-level .login-dialog-button.cancel-button:checked, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked, .keyboard-brightness-level .background-app-item .close-button:checked, .background-app-item .keyboard-brightness-level .close-button:checked, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked, .keyboard-brightness-level .calendar .calendar-day:checked, .calendar .keyboard-brightness-level .calendar-day:checked {
++    transition-duration: 100ms;
++    background-color: #3584e4;
++    color: #ffffff; }
++    .keyboard-brightness-level .button:checked:focus, .keyboard-brightness-level .icon-button:checked:focus, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:focus, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:focus, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:focus, .keyboard-brightness-level .background-app-item .close-button:checked:focus, .background-app-item .keyboard-brightness-level .close-button:checked:focus, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:focus, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:focus, .keyboard-brightness-level .calendar .calendar-day:checked:focus, .calendar .keyboard-brightness-level .calendar-day:checked:focus {
++      box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.6) !important; }
++    .keyboard-brightness-level .button:checked:hover, .keyboard-brightness-level .icon-button:checked:hover, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:hover, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:hover, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:hover, .keyboard-brightness-level .background-app-item .close-button:checked:hover, .background-app-item .keyboard-brightness-level .close-button:checked:hover, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:hover, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:hover, .keyboard-brightness-level .calendar .calendar-day:checked:hover, .calendar .keyboard-brightness-level .calendar-day:checked:hover, .keyboard-brightness-level .button:checked:focus, .keyboard-brightness-level .icon-button:checked:focus, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:focus, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:focus, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:focus, .keyboard-brightness-level .background-app-item .close-button:checked:focus, .background-app-item .keyboard-brightness-level .close-button:checked:focus, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:focus, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:focus, .keyboard-brightness-level .calendar .calendar-day:checked:focus, .calendar .keyboard-brightness-level .calendar-day:checked:focus {
++      background-color: #4b92e7;
++      color: white; }
++    .keyboard-brightness-level .button:checked:active, .keyboard-brightness-level .icon-button:checked:active, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:active, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:active, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:active, .keyboard-brightness-level .background-app-item .close-button:checked:active, .background-app-item .keyboard-brightness-level .close-button:checked:active, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:active, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:active, .keyboard-brightness-level .calendar .calendar-day:checked:active, .calendar .keyboard-brightness-level .calendar-day:checked:active {
++      background-color: #1d72d8;
++      color: #ededed; }
++    .keyboard-brightness-level .button:checked:insensitive, .keyboard-brightness-level .icon-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.cancel-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.switch-user-button:checked:insensitive, .keyboard-brightness-level .login-dialog-button.login-dialog-session-list-button:checked:insensitive, .keyboard-brightness-level .background-app-item .close-button:checked:insensitive, .background-app-item .keyboard-brightness-level .close-button:checked:insensitive, .keyboard-brightness-level .calendar .calendar-month-header .pager-button:checked:insensitive, .calendar .calendar-month-header .keyboard-brightness-level .pager-button:checked:insensitive, .keyboard-brightness-level .calendar .calendar-day:checked:insensitive, .calendar .keyboard-brightness-level .calendar-day:checked:insensitive {
++      transition-duration: 100ms;
++      color: rgba(40, 40, 40, 0.4);
++      background-color: rgba(40, 40, 40, 0.1);
++      background-color: rgba(53, 132, 228, 0.5);
++      color: rgba(255, 255, 255, 0.5); }
++
 +.background-apps-quick-toggle {
 +  min-height: 40px;
 +  background-color: transparent; }
 +  .background-apps-quick-toggle StIcon {
 +    icon-size: 1.09em !important; }
 +
 +.background-app-item .popup-menu-icon {
 +  icon-size: 2.18em !important;
 +  -st-icon-style: regular !important; }
 +
 +.background-app-item .close-button {
 +  padding: 6px; }
 +
 +.background-app-item .spinner {
 +  padding: 6px; }
 +
 +.background-app-item.popup-inactive-menu-item {
 +  color: #282828; }
 +
 +/* OVERVIEW */
 +.controls-manager, .secondary-monitor-workspaces {
 +  spacing: 12px; }
 +
 +#overviewGroup {
 +  background-color: #282828; }
 +
 +.overview-controls {
 +  padding-bottom: 32px; }
 +
 +/* Window Picker */
 +.window-picker {
 +  spacing: 6px; }
 +
 +.window-close, .screenshot-ui-close-button {
 +  background-color: rgba(71, 71, 71, 0.98);
 +  color: #f6f5f4;
 +  border-radius: 99px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05);
 +  padding: 3px;
 +  height: 30px;
 +  width: 30px;
 +  transition-duration: 100ms; }
 +  .window-close StIcon, .screenshot-ui-close-button StIcon {
 +    icon-size: 24px; }
 +  .window-close:hover, .screenshot-ui-close-button:hover {
 +    background-color: rgba(88, 88, 88, 0.98); }
 +  .window-close:active, .screenshot-ui-close-button:active {
 +    background-color: rgba(104, 104, 104, 0.98); }
 +
 +.workspace-background {
 +  border-radius: 30px;
 +  background-color: rgba(3, 2, 1, 0);
 +  box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.05); }
 +
 +.search-entry {
 +  border-radius: 99px;
 +  margin-top: 12px;
 +  margin-bottom: 6px;
 +  width: 24em; }
 +  .search-entry .search-entry-icon {
 +    icon-size: 1.09em;
 +    margin-top: 2px;
 +    padding: 0 4px; }
 +
 +/* Search */
 +#searchResults {
 +  margin: 0 4px; }
 +
 +#searchResultsContent {
 +  max-width: 1072px; }
 +
 +.search-section {
 +  spacing: 18px; }
 +  .search-section .search-section-separator {
 +    height: 8px;
 +    background-color: transparent; }
 +
 +.search-section-content {
 +  background-color: #3d3d3c;
 +  color: #f6f5f4;
 +  border-radius: 24px;
 +  padding: 12px;
 +  margin: 0 12px; }
 +
 +.list-search-result, .search-provider-icon {
 +  background-color: transparent;
 +  border-radius: 11px; }
 +  .list-search-result:hover, .search-provider-icon:hover {
 +    background-color: rgba(246, 245, 244, 0.1); }
 +  .list-search-result:selected, .search-provider-icon:selected, .list-search-result:focus, .search-provider-icon:focus {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:focus:hover, .search-provider-icon:focus:hover {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:focus:active, .search-provider-icon:focus:active {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .list-search-result:active, .search-provider-icon:active {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .list-search-result:outlined, .search-provider-icon:outlined, .list-search-result:checked, .search-provider-icon:checked {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .list-search-result:outlined:active, .search-provider-icon:outlined:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .list-search-result:outlined:hover, .search-provider-icon:outlined:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .list-search-result:drop, .search-provider-icon:drop {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.search-statustext {
 +  color: rgba(246, 245, 244, 0.8); }
 +
 +.grid-search-results {
 +  spacing: 30px;
 +  margin: 0 12px; }
 +
 +.search-provider-icon:ltr {
 +  margin-right: 4px; }
 +
 +.search-provider-icon:rtl {
 +  margin-left: 4px; }
 +
 +.search-provider-icon .list-search-provider-content {
 +  spacing: 12px; }
 +  .search-provider-icon .list-search-provider-content .list-search-provider-details {
 +    width: 120px;
 +    color: #f6f5f4; }
 +
 +.list-search-results {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-content {
 +  spacing: 6px; }
 +
 +.list-search-result .list-search-result-title {
 +  spacing: 12px; }
 +
 +.list-search-result .list-search-result-description {
 +  color: #959594; }
 +
 +/* Dash */
 +#dash {
 +  margin-top: 12px; }
 +  #dash .placeholder {
 +    background-image: none;
 +    background-size: contain;
 +    height: 32px; }
 +  #dash .empty-dash-drop-target {
 +    width: 32px;
 +    height: 32px; }
 +  #dash .app-well-app-running-dot {
 +    margin-bottom: 14px; }
 +
 +.dash-background {
 +  background-color: #3d3d3c;
 +  border-radius: 28px;
 +  padding: 12px;
 +  spacing: 6px;
 +  margin-bottom: 12px; }
 +
 +.dash-item-container > * {
 +  margin: 0 2px; }
 +
 +.dash-item-container:ltr:first-child {
 +  margin-left: 0; }
 +
 +.dash-item-container:rtl:first-child {
 +  margin-right: 0; }
 +
 +.dash-item-container .app-well-app .overview-icon, .dash-item-container .grid-search-result .overview-icon {
 +  padding: 6px;
 +  border-radius: 16px; }
 +
 +.dash-item-container .show-apps {
 +  transition-duration: 400ms; }
 +  .dash-item-container .show-apps .overview-icon {
 +    background-color: transparent; }
 +  .dash-item-container .show-apps:hover .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +  .dash-item-container .show-apps:selected .overview-icon, .dash-item-container .show-apps:focus .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .dash-item-container .show-apps:selected .overview-icon:hover .overview-icon, .dash-item-container .show-apps:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .dash-item-container .show-apps:selected .overview-icon:active .overview-icon, .dash-item-container .show-apps:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .dash-item-container .show-apps:active .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .dash-item-container .show-apps:outlined .overview-icon, .dash-item-container .show-apps:checked .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .dash-item-container .show-apps:outlined .overview-icon:active .overview-icon, .dash-item-container .show-apps:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .dash-item-container .show-apps:outlined .overview-icon:hover .overview-icon, .dash-item-container .show-apps:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .dash-item-container .show-apps:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.dash-item-container .show-apps, .dash-item-container .app-well-app, .dash-item-container .grid-search-result {
 +  padding-bottom: 12px;
 +  color: #f6f5f4; }
 +
 +.dash-separator {
 +  width: 1px;
 +  margin: 0 4px;
 +  background-color: rgba(246, 245, 244, 0.1);
 +  margin-bottom: 12px; }
 +
 +.dash-label {
 +  -y-offset: 8px; }
 +
 +/* App Grid */
 +.icon-grid {
 +  row-spacing: 12px;
 +  column-spacing: 12px;
 +  max-row-spacing: 42px;
 +  max-column-spacing: 42px;
 +  page-padding-top: 24px;
 +  page-padding-bottom: 24px;
 +  page-padding-left: 18px;
 +  page-padding-right: 18px; }
 +
 +/* App Icons */
 +.app-well-app, .grid-search-result {
 +  transition-duration: 400ms; }
 +  .app-well-app .overview-icon, .grid-search-result .overview-icon {
 +    background-color: transparent; }
 +  .app-well-app:hover .overview-icon, .grid-search-result:hover .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app:selected .overview-icon, .grid-search-result:selected .overview-icon, .app-well-app:focus .overview-icon, .grid-search-result:focus .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .app-well-app:selected .overview-icon:hover .overview-icon, .grid-search-result:selected .overview-icon:hover .overview-icon, .app-well-app:focus .overview-icon:hover .overview-icon, .grid-search-result:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .app-well-app:selected .overview-icon:active .overview-icon, .grid-search-result:selected .overview-icon:active .overview-icon, .app-well-app:focus .overview-icon:active .overview-icon, .grid-search-result:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app:active .overview-icon, .grid-search-result:active .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .app-well-app:outlined .overview-icon, .grid-search-result:outlined .overview-icon, .app-well-app:checked .overview-icon, .grid-search-result:checked .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .app-well-app:outlined .overview-icon:active .overview-icon, .grid-search-result:outlined .overview-icon:active .overview-icon, .app-well-app:checked .overview-icon:active .overview-icon, .grid-search-result:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .app-well-app:outlined .overview-icon:hover .overview-icon, .grid-search-result:outlined .overview-icon:hover .overview-icon, .app-well-app:checked .overview-icon:hover .overview-icon, .grid-search-result:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .app-well-app:drop .overview-icon, .grid-search-result:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +  .app-well-app .overview-icon, .grid-search-result .overview-icon {
 +    padding: 12px;
 +    border-radius: 24px;
 +    color: #f6f5f4; }
 +  .app-well-app .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
 +    spacing: 6px; }
 +
 +.app-well-app.app-folder, .app-folder.grid-search-result {
 +  transition-duration: 400ms; }
 +  .app-well-app.app-folder .overview-icon, .app-folder.grid-search-result .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.07); }
 +  .app-well-app.app-folder:hover .overview-icon, .app-folder.grid-search-result:hover .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app.app-folder:selected .overview-icon, .app-folder.grid-search-result:selected .overview-icon, .app-well-app.app-folder:focus .overview-icon, .app-folder.grid-search-result:focus .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.13); }
 +    .app-well-app.app-folder:selected .overview-icon:hover .overview-icon, .app-folder.grid-search-result:selected .overview-icon:hover .overview-icon, .app-well-app.app-folder:focus .overview-icon:hover .overview-icon, .app-folder.grid-search-result:focus .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.16); }
 +    .app-well-app.app-folder:selected .overview-icon:active .overview-icon, .app-folder.grid-search-result:selected .overview-icon:active .overview-icon, .app-well-app.app-folder:focus .overview-icon:active .overview-icon, .app-folder.grid-search-result:focus .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.13); }
 +  .app-well-app.app-folder:active .overview-icon, .app-folder.grid-search-result:active .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.16); }
 +  .app-well-app.app-folder:outlined .overview-icon, .app-folder.grid-search-result:outlined .overview-icon, .app-well-app.app-folder:checked .overview-icon, .app-folder.grid-search-result:checked .overview-icon {
 +    background-color: rgba(246, 245, 244, 0.19); }
 +    .app-well-app.app-folder:outlined .overview-icon:active .overview-icon, .app-folder.grid-search-result:outlined .overview-icon:active .overview-icon, .app-well-app.app-folder:checked .overview-icon:active .overview-icon, .app-folder.grid-search-result:checked .overview-icon:active .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.22); }
 +    .app-well-app.app-folder:outlined .overview-icon:hover .overview-icon, .app-folder.grid-search-result:outlined .overview-icon:hover .overview-icon, .app-well-app.app-folder:checked .overview-icon:hover .overview-icon, .app-folder.grid-search-result:checked .overview-icon:hover .overview-icon {
 +      background-color: rgba(246, 245, 244, 0.25); }
 +  .app-well-app.app-folder:drop .overview-icon, .app-folder.grid-search-result:drop .overview-icon {
 +    border: 2px solid rgba(53, 132, 228, 0.8);
 +    background-color: rgba(53, 132, 228, 0.2); }
 +
 +.app-folder-dialog {
 +  border-radius: 64px;
-   box-shadow: inset 0 0 0 1px #e6e3e0; }
++  background-color: #3d3d3c;
 +  padding: 12px;
-       width: 12em; }
++  box-shadow: inset 0 0 0 1px rgba(246, 245, 244, 0.1); }
 +  .app-folder-dialog .folder-name-container {
 +    padding: 24px 36px 0;
 +    spacing: 12px;
 +    /* FIXME: this is to keep the label in sync with the entry */ }
 +    .app-folder-dialog .folder-name-container .folder-name-entry {
-       transition-duration: 100ms;
-       color: rgba(40, 40, 40, 0.5);
-       background-color: rgba(40, 40, 40, 0.05);
-       background-color: transparent;
-       color: rgba(255, 255, 255, 0.5); }
++      width: 12em;
++      color: #f6f5f4 !important; }
 +    .app-folder-dialog .folder-name-container .folder-name-label {
 +      padding: 5px 7px;
 +      color: #f6f5f4; }
 +    .app-folder-dialog .folder-name-container .edit-folder-button {
 +      padding: 0;
 +      width: 36px;
 +      height: 36px;
 +      border-radius: 99px; }
 +      .app-folder-dialog .folder-name-container .edit-folder-button > StIcon {
 +        icon-size: 1.09em; }
 +  .app-folder-dialog .icon-grid {
 +    row-spacing: 12px;
 +    column-spacing: 30px;
 +    page-padding-top: 0;
 +    page-padding-bottom: 0;
 +    page-padding-left: 0;
 +    page-padding-right: 0; }
 +  .app-folder-dialog .page-indicators {
 +    margin-bottom: 18px; }
 +
 +.app-folder-dialog-container {
 +  padding: 12px;
 +  width: 720px;
 +  height: 720px; }
 +
 +.app-well-app-running-dot {
 +  height: 5px;
 +  width: 5px;
 +  border-radius: 5px;
 +  margin-bottom: 8px;
 +  background-color: #f6f5f4; }
 +
 +.rename-folder-popup .rename-folder-popup-item {
 +  spacing: 6px; }
 +  .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
 +    padding: 0 12px; }
 +
 +.page-indicator {
 +  padding: 6px 12px 0;
 +  transition-duration: 400ms; }
 +  .page-indicator .page-indicator-icon {
 +    width: 10px;
 +    height: 10px;
 +    border-radius: 10px;
 +    background-color: white;
 +    transition-duration: 400ms; }
 +
 +.apps-scroll-view {
 +  padding: 0; }
 +
 +.system-action-icon {
 +  background-color: rgba(246, 245, 244, 0.1);
 +  color: #f6f5f4;
 +  border-radius: 99px;
 +  icon-size: 48px; }
 +
 +.page-navigation-hint.dnd {
 +  background: rgba(255, 255, 255, 0.1); }
 +
 +.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
 +  background-gradient-start: rgba(255, 255, 255, 0.05);
 +  background-gradient-end: transparent;
 +  background-gradient-direction: horizontal;
 +  border-radius: 24px 0px 0px 24px; }
 +
 +.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
 +  background-gradient-start: transparent;
 +  background-gradient-end: rgba(255, 255, 255, 0.05);
 +  background-gradient-direction: horizontal;
 +  border-radius: 0px 24px 24px 0px; }
 +
 +.page-navigation-arrow {
 +  margin: 6px;
 +  padding: 18px;
 +  width: 24px;
 +  height: 24px;
 +  border-radius: 99px;
 +  transition-duration: 100ms; }
 +  .page-navigation-arrow > StIcon {
 +    color: #f6f5f4; }
 +  .page-navigation-arrow:insensitive {
 +    transition-duration: 100ms;
 +    background-color: transparent;
 +    background-color: none;
 +    box-shadow: none; }
 +    .page-navigation-arrow:insensitive:insensitive {
-   color: #282828;
++      background-color: transparent; }
 +  .page-navigation-arrow:hover {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: rgba(101, 101, 100, 0.56); }
 +  .page-navigation-arrow:active {
 +    transition-duration: 100ms;
 +    color: #f6f5f4;
 +    background-color: rgba(94, 94, 93, 0.56); }
 +
 +/* Workspace pager */
 +.workspace-thumbnails {
 +  visible-width: 32px;
 +  spacing: 6px;
 +  padding: 6px; }
 +  .workspace-thumbnails .workspace-thumbnail {
 +    color: #f6f5f4;
 +    background-color: #4e4e4e;
 +    border-radius: 4px;
 +    border: 1px solid transparent; }
 +  .workspace-thumbnails .placeholder {
 +    background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
 +    background-size: contain;
 +    width: 18px; }
 +
 +.workspace-thumbnail-indicator {
 +  border: 3px solid #3584e4;
 +  border-radius: 8px; }
 +
 +.ripple-pointer-location {
 +  width: 50px;
 +  height: 50px;
 +  border-radius: 25px;
 +  background-color: rgba(188, 214, 246, 0.3);
 +  box-shadow: 0 0 2px 2px #8fbbf0; }
 +
 +.pie-timer {
 +  width: 60px;
 +  height: 60px;
 +  -pie-border-width: 3px;
 +  -pie-border-color: #3584e4;
 +  -pie-background-color: rgba(233, 242, 252, 0.3); }
 +
 +.magnifier-zoom-region {
 +  border: 2px solid #3584e4; }
 +  .magnifier-zoom-region.full-screen {
 +    border-width: 0; }
 +
 +.select-area-rubberband {
 +  background-color: rgba(53, 132, 228, 0.3);
 +  border: 1px solid #3584e4; }
 +
 +.user-icon {
 +  background-size: contain;
-     background-color: rgba(40, 40, 40, 0.05);
++  color: #ffffff;
 +  border-radius: 99px;
 +  icon-size: 4.36em; }
 +  .user-icon StIcon {
-     box-shadow: inset 0 0 0 1px rgba(40, 40, 40, 0.1); }
++    background-color: rgba(255, 255, 255, 0.05);
 +    border-radius: 99px;
 +    padding: 12px;
 +    width: 2.725em;
 +    height: 2.725em; }
 +  .user-icon.user-avatar {
-   background-color: #deddda;
-   box-shadow: inset 0 1px 0 0 rgba(40, 40, 40, 0.02); }
++    box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); }
 +
 +.lightbox {
 +  background-color: black; }
 +
 +.flashspot {
 +  background-color: white; }
 +
 +.hidden {
 +  color: transparent; }
 +
 +.caps-lock-warning-label {
 +  text-align: center;
 +  padding-bottom: 8px;
 +  color: #f5c211; }
 +
 +/* Workspace animation */
 +.workspace-animation {
 +  background-color: #353535; }
 +
 +/* Tiled window previews */
 +.tile-preview {
 +  background-color: rgba(53, 132, 228, 0.5);
 +  border: 1px solid #3584e4; }
 +
 +/* On-screen Keyboard */
 +#keyboard {
-   color: #282828;
-   background-color: #080808; }
++  background-color: #353535;
++  box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); }
 +  #keyboard .page-indicator {
 +    padding: 6px; }
 +    #keyboard .page-indicator .page-indicator-icon {
 +      width: 8px;
 +      height: 8px; }
 +
 +.key-container {
 +  padding: 4px;
 +  spacing: 4px; }
 +
 +.keyboard-key {
 +  font-size: 16pt;
 +  font-weight: bold;
 +  min-height: 1.2em;
 +  min-width: 1.2em;
 +  border-width: 1px;
 +  border-style: solid;
 +  border-radius: 12px;
 +  box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.05);
-     color: #282828;
-     background-color: #d4dbe2;
++  color: #ffffff;
++  background-color: #545454; }
 +  .keyboard-key:focus {
-       background-color: #dee6ee;
++    color: #ffffff;
++    background-color: #3c444d;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +    .keyboard-key:focus:hover {
-       background-color: #e3eaf3;
++      background-color: #474f59;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .keyboard-key:focus:active {
-     color: #282828;
-     background-color: #121212; }
++      background-color: #4c545d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +  .keyboard-key:hover {
-     color: #282828;
-     background-color: #1a1a1a; }
++    color: #ffffff;
++    background-color: #5e5e5e; }
 +  .keyboard-key:active {
-     color: #282828;
-     background-color: #262626; }
++    color: #ffffff;
++    background-color: #666666; }
 +  .keyboard-key:checked {
-     color: #282828;
-     border-color: rgba(40, 40, 40, 0.1); }
++    color: #ffffff;
++    background-color: #737373; }
 +  .keyboard-key:grayed {
 +    background-color: #efedec;
-     color: #282828;
-     background-color: #080808;
++    color: #ffffff;
++    border-color: rgba(255, 255, 255, 0.1); }
 +  .keyboard-key.default-key {
-       color: #282828;
-       background-color: #121212; }
++    color: #ffffff;
++    background-color: #383838;
 +    border-radius: 12px; }
 +    .keyboard-key.default-key:hover {
-       color: #282828;
-       background-color: #1a1a1a; }
++      color: #ffffff;
++      background-color: #424242; }
 +    .keyboard-key.default-key:active {
-       color: #282828;
-       background-color: #262626; }
++      color: #ffffff;
++      background-color: #4a4a4a; }
 +    .keyboard-key.default-key:checked {
-     color: #282828; }
++      color: #ffffff;
++      background-color: #575757; }
 +    .keyboard-key.default-key:latched {
 +      border-color: #4b92e7;
 +      background-color: #3584e4; }
 +  .keyboard-key.enter-key {
 +    color: #ffffff;
 +    background-color: #428ce6;
 +    border-radius: 12px;
-     background-color: #333333;
-     color: #deddda; }
++    color: #ffffff; }
 +    .keyboard-key.enter-key:hover {
 +      color: #ffffff;
 +      background-color: #5497e8; }
 +    .keyboard-key.enter-key:active {
 +      color: #ffffff;
 +      background-color: #629fea; }
 +    .keyboard-key.enter-key:checked {
 +      color: #ffffff;
 +      background-color: #78aded; }
 +  .keyboard-key.shift-key-uppercase {
-       background-color: #404040;
-       color: #eae9e7; }
++    background-color: gray;
++    color: #353535; }
 +    .keyboard-key.shift-key-uppercase:hover {
-   -arrow-background-color: #deddda;
++      background-color: #8c8c8c;
++      color: #424242; }
 +  .keyboard-key StIcon {
 +    icon-size: 24px; }
 +
 +.keyboard-subkeys {
 +  -arrow-border-radius: 16px;
-   -arrow-border-color: #f4f3f2;
++  -arrow-background-color: #353535;
 +  -arrow-border-width: 1px;
-     color: #282828;
-     background-color: #080808;
++  -arrow-border-color: #4c4c4c;
 +  -arrow-base: 20px;
 +  -arrow-rise: 10px;
 +  -boxpointer-gap: 6px;
 +  padding: 6px; }
 +  .keyboard-subkeys .keyboard-key {
-       color: #282828;
-       background-color: #d4dbe2;
++    color: #ffffff;
++    background-color: #545454;
 +    border-radius: 12px; }
 +    .keyboard-subkeys .keyboard-key:focus {
-         background-color: #dee6ee;
++      color: #ffffff;
++      background-color: #3c444d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +      .keyboard-subkeys .keyboard-key:focus:hover {
-         background-color: #e3eaf3;
++        background-color: #474f59;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +      .keyboard-subkeys .keyboard-key:focus:active {
-       color: #282828;
-       background-color: #121212; }
++        background-color: #4c545d;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .keyboard-subkeys .keyboard-key:hover {
-       color: #282828;
-       background-color: #1a1a1a; }
++      color: #ffffff;
++      background-color: #5e5e5e; }
 +    .keyboard-subkeys .keyboard-key:active {
-       color: #282828;
-       background-color: #262626; }
++      color: #ffffff;
++      background-color: #666666; }
 +    .keyboard-subkeys .keyboard-key:checked {
-   color: #282828; }
++      color: #ffffff;
++      background-color: #737373; }
 +
 +.emoji-page .keyboard-key {
 +  background-color: transparent;
 +  border: none;
 +  color: initial; }
 +
 +.emoji-panel .keyboard-key:latched {
 +  border-color: #4b92e7;
 +  background-color: #3584e4; }
 +
 +.word-suggestions {
 +  font-size: 12pt;
 +  spacing: 12px;
 +  min-height: 17pt;
 +  padding: 12px;
-       color: #282828;
-       background-color: #d4dbe2;
++  color: #ffffff; }
 +  .word-suggestions StButton {
 +    margin: 0 3px;
 +    min-width: 32px;
 +    border-radius: 6px;
 +    padding: 0px 18px;
 +    background-color: transparent;
 +    background-image: none; }
 +    .word-suggestions StButton:focus {
-         background-color: #dee6ee;
++      color: #ffffff;
++      background-color: #3c444d;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6); }
 +      .word-suggestions StButton:focus:hover {
-         background-color: #e3eaf3;
++        background-color: #474f59;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +      .word-suggestions StButton:focus:active {
-       color: #282828;
-       background-color: #121212; }
++        background-color: #4c545d;
 +        box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7); }
 +    .word-suggestions StButton:hover {
-       color: #282828;
-       background-color: #1a1a1a; }
++      color: #ffffff;
++      background-color: #5e5e5e; }
 +    .word-suggestions StButton:active {
-       color: #282828;
-       background-color: #262626; }
++      color: #ffffff;
++      background-color: #666666; }
 +    .word-suggestions StButton:checked {
-   background-color: rgba(222, 221, 218, 0.98);
-   color: #282828;
-   border-radius: 0 0 16px 16px;
++      color: #ffffff;
++      background-color: #737373; }
 +
 +/* Looking Glass */
 +#LookingGlassDialog {
-     color: rgba(40, 40, 40, 0.5);
-     background-color: rgba(40, 40, 40, 0.05); }
++  background-color: rgba(53, 53, 53, 0.98);
++  color: #ffffff;
++  border-radius: 16px;
++  margin-top: 4px;
 +  border-top-width: 0;
 +  padding: 6px;
 +  spacing: 6px;
 +  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
 +  #LookingGlassDialog > #Toolbar {
 +    border: none;
 +    padding: 6px;
 +    border-radius: 0;
 +    background-color: transparent;
 +    spacing: 6px; }
 +    #LookingGlassDialog > #Toolbar .lg-toolbar-button {
 +      padding: 6px 12px; }
 +      #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
 +        icon-size: 1.09em; }
 +  #LookingGlassDialog .labels {
 +    spacing: 6px; }
 +  #LookingGlassDialog .notebook-tab {
 +    -natural-hpadding: 12px;
 +    -minimum-hpadding: 12px;
 +    padding: 6px 12px; }
 +  #LookingGlassDialog StBoxLayout#EvalBox {
 +    padding: 4px;
 +    spacing: 6px;
 +    padding: 6px; }
 +  #LookingGlassDialog StBoxLayout#ResultsArea {
 +    spacing: 6px;
 +    padding: 6px; }
 +
 +.lg-dialog StEntry {
 +  min-height: 22px; }
 +
 +.lg-dialog .shell-link {
 +  color: #1b6acb; }
 +  .lg-dialog .shell-link:hover {
 +    color: #3584e4; }
 +  .lg-dialog .shell-link:active {
 +    color: #15539e; }
 +
 +.lg-dialog .actor-link {
 +  color: #7a7a7a; }
 +  .lg-dialog .actor-link:hover {
 +    color: #adadad; }
 +  .lg-dialog .actor-link:active {
 +    color: #474747; }
 +  .lg-dialog .actor-link StIcon {
 +    icon-size: 12px; }
 +
 +.lg-completions-text {
 +  font-style: italic; }
 +
 +.lg-obj-inspector-title {
 +  spacing: 6px; }
 +
 +.lg-obj-inspector-button {
 +  border: 1px solid rgba(40, 40, 40, 0.15);
 +  padding: 4px;
 +  border-radius: 8px; }
 +  .lg-obj-inspector-button:hover {
 +    border: 1px solid #282828; }
 +
 +#lookingGlassExtensions {
 +  padding: 6px; }
 +
 +.lg-extensions-list {
 +  padding: 6px;
 +  spacing: 6px; }
 +
 +.lg-extension {
 +  padding: 12px;
 +  border-radius: 12px;
 +  margin: 4px;
 +  transition-duration: 100ms;
 +  color: #282828;
 +  background-color: #dddcdc; }
 +  .lg-extension:hover {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #d5d4d4; }
 +  .lg-extension:active {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #cecccc; }
 +  .lg-extension:focus {
 +    transition-duration: 100ms;
 +    color: #282828;
 +    background-color: #ccd3dd;
 +    box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.6) !important; }
 +    .lg-extension:focus:hover {
 +      background-color: #d3dae4;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +    .lg-extension:focus:active {
 +      background-color: #dae1eb;
 +      box-shadow: inset 0 0 0 2px rgba(53, 132, 228, 0.7) !important; }
 +  .lg-extension:insensitive {
 +    transition-duration: 100ms;
-   color: #282828; }
++    color: rgba(40, 40, 40, 0.4);
++    background-color: rgba(40, 40, 40, 0.1); }
 +
 +.lg-extension-meta {
 +  spacing: 6px; }
 +
 +#LookingGlassPropertyInspector {
 +  background: #f6f5f4;
 +  border: 1px solid rgba(40, 40, 40, 0.15);
 +  border-radius: 8px;
 +  padding: 6px; }
 +
 +.lg-debug-flag-button {
-     color: #5b5b5b; }
++  color: #ffffff; }
 +  .lg-debug-flag-button StLabel {
 +    padding: 6px, 12px; }
 +  .lg-debug-flag-button:hover {
-     color: black; }
++    color: white; }
 +  .lg-debug-flag-button:active {
++    color: #cccccc; }
 +
 +.lg-debug-flags-header {
 +  padding-top: 12px;
 +  padding: 6px; }
 +
 +.login-dialog .caps-lock-warning-label,
 +.login-dialog .login-dialog-message-warning,
 +.unlock-dialog .caps-lock-warning-label,
 +.unlock-dialog .login-dialog-message-warning {
 +  color: #f6f5f4; }
 +
 +/* Login Dialog */
 +.login-dialog {
 +  background-color: #353535; }
 +
 +.login-dialog-button.cancel-button {
 +  padding: 9px; }
 +
 +.login-dialog-button-box {
 +  width: 23em;
 +  spacing: 12px; }
 +
 +.login-dialog-logo-bin {
 +  margin: 3em 0; }
 +
 +.login-dialog-banner {
 +  color: #dfdcd8; }
 +
 +.login-dialog-banner-view {
 +  max-width: 23em; }
 +
 +.login-dialog-message {
 +  text-align: center; }
 +
 +.login-dialog-user-selection-box {
 +  padding: 100px 0px; }
 +
 +.login-dialog-not-listed-label {
 +  font-size: 11pt;
 +  font-weight: bold;
 +  color: #b1a9a0;
 +  padding: 12px; }
 +  .login-dialog-not-listed-button:focus .login-dialog-not-listed-label, .login-dialog-not-listed-button:hover .login-dialog-not-listed-label {
 +    color: #f6f5f4; }
 +  .login-dialog-not-listed-button:focus .login-dialog-not-listed-label {
 +    text-decoration: underline; }
 +
 +.login-dialog-auth-list-view {
 +  -st-vfade-offset: 1em; }
 +
 +.login-dialog-auth-list {
 +  spacing: 6px;
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-title {
 +  margin-left: 2em; }
 +
 +.login-dialog-auth-list-item {
 +  border-radius: 16px;
 +  padding: 4px;
 +  color: #b1a9a0; }
 +  .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
 +    background-color: #3584e4;
 +    color: #ffffff; }
 +
 +.login-dialog-auth-list-label {
 +  font-size: 13pt;
 +  font-weight: bold;
 +  padding-left: 15px; }
 +  .login-dialog-auth-list-label:ltr {
 +    padding-left: 14px;
 +    text-align: left; }
 +  .login-dialog-auth-list-label:rtl {
 +    padding-right: 14px;
 +    text-align: right; }
 +
 +.login-dialog-user-list-view {
 +  -st-vfade-offset: 1em; }
 +
 +.login-dialog-user-list {
 +  spacing: 12px;
 +  width: 23em; }
 +  .login-dialog-user-list .login-dialog-user-list-item {
 +    border-radius: 12px;
 +    padding: 6px;
 +    background-color: rgba(246, 245, 244, 0.05);
 +    color: #f6f5f4; }
 +    .login-dialog-user-list .login-dialog-user-list-item .user-widget .user-icon {
 +      border: 4px solid transparent; }
 +    .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
 +      height: 2px;
 +      margin-top: 6px;
 +      background-color: #b1a9a0; }
 +    .login-dialog-user-list .login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
 +      background-color: #ffffff; }
 +  .login-dialog-user-list:expanded .login-dialog-user-list-item {
 +    transition-duration: 300ms;
 +    transition-timing-function: ease; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:hover {
 +      background-color: rgba(246, 245, 244, 0.1);
 +      color: #f6f5f4; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
 +      background-color: #3584e4;
 +      color: #ffffff; }
 +      .login-dialog-user-list:expanded .login-dialog-user-list-item:selected:hover {
 +        background-color: #4b92e7; }
 +    .login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in .user-widget .user-icon {
 +      border-color: #3584e4; }
 +
 +.login-dialog-prompt-layout {
 +  spacing: 12px;
 +  width: 26em; }
 +
 +/* Screen Shield */
 +.unlock-dialog {
 +  background-color: transparent; }
 +
 +.screen-shield-background {
 +  background: black;
 +  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
 +
 +#lockDialogGroup {
 +  background-color: #353535; }
 +
 +.unlock-dialog-clock {
 +  color: #f6f5f4;
 +  spacing: 2em; }
 +  .unlock-dialog-clock .unlock-dialog-clock-time {
 +    font-size: 72pt;
 +    font-weight: 200; }
 +  .unlock-dialog-clock .unlock-dialog-clock-date {
 +    font-weight: 400; }
 +  .unlock-dialog-clock .unlock-dialog-clock-hint {
 +    margin-top: 2em;
 +    padding: 6px 18px;
 +    border-radius: 16px;
 +    font-weight: bold; }
 +
 +#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
 +  background-color: rgba(246, 245, 244, 0.3); }
 +  #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
 +    background-color: rgba(246, 245, 244, 0.5); }
 +  #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
 +    background-color: rgba(53, 132, 228, 0.5); }
 +
 +.unlock-dialog-notifications-container {
 +  margin: 12px;
 +  spacing: 6px;
 +  width: 23em;
 +  background-color: transparent; }
 +  .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
 +    padding-top: 0;
 +    padding-bottom: 0; }
 +  .unlock-dialog-notifications-container .notification,
 +  .unlock-dialog-notifications-container .unlock-dialog-notification-source {
 +    padding: 12px 16px;
 +    border: none;
 +    background-color: rgba(246, 245, 244, 0.1);
 +    color: #f6f5f4;
 +    border-radius: 16px; }
 +    .unlock-dialog-notifications-container .notification.critical,
 +    .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
 +      background-color: rgba(246, 245, 244, 0.2); }
 +
 +.unlock-dialog-notification-label {
 +  padding-left: 12px;
 +  padding-right: 0; }
 +  .unlock-dialog-notification-label:rtl {
 +    padding-right: 12px;
 +    padding-left: 0; }
 +
 +.unlock-dialog-notification-count-text {
 +  font-weight: bold;
 +  padding: 0 12px;
 +  color: #f6f5f4;
 +  background-color: rgba(246, 245, 244, 0.1);
 +  border-radius: 99px; }
 +
 +.user-widget .user-widget-label {
 +  color: #f6f5f4; }
 +
 +.user-widget.horizontal {
 +  spacing: 18px; }
 +  .user-widget.horizontal .user-icon StIcon {
 +    padding: 12px;
 +    icon-size: 2.18em;
 +    width: 3.27em;
 +    height: 3.27em;
 +    background-color: rgba(246, 245, 244, 0.1); }
 +
 +.user-widget.vertical {
 +  spacing: 24px; }
 +  .user-widget.vertical .user-widget-label {
 +    text-align: center;
 +    margin-bottom: .75em; }
 +  .user-widget.vertical .user-icon {
 +    icon-size: 10.9em; }
 +    .user-widget.vertical .user-icon StIcon {
 +      padding: 32px;
 +      icon-size: 4.36em;
 +      background-color: rgba(246, 245, 244, 0.1); }
index ad894f09e6310986543398bac0ba1da13137ca4f,0000000000000000000000000000000000000000..447a65541e0c45ab7638268cf46fb99656d7c81d
mode 100644,000000..100644
--- /dev/null
@@@ -1,13 -1,0 +1,16 @@@
-     - dnf install -y redhat-rpm-config gcc meson pulseaudio-libs-devel alsa-lib-devel gtk3-devel
 +stages:
 +- test
 +
 +build-fedora:
 +  image: fedora:latest
 +  stage: test
 +  before_script:
++    - dnf install -y redhat-rpm-config gcc clang meson pulseaudio-libs-devel alsa-lib-devel gtk3-devel
 +  script:
 +    - cd .gitlab-ci
 +    - meson _build
 +    - ninja -C _build
++    - rm -rf _build
++    - CC=clang meson _build
++    - ninja -C _build
 +
index bf4d737d59314b1bb9414419d82fc924033b1ca7,0000000000000000000000000000000000000000..688a451aefede7345a3c75387de9bce303ca5ca2
mode 100644,000000..100644
--- /dev/null
@@@ -1,247 -1,0 +1,246 @@@
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__BOOLEAN,
 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 + *
 + * Copyright (C) 2008 William Jon McCann
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 + *
 + */
 +
 +#include "config.h"
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <unistd.h>
 +
 +#include <glib.h>
 +#include <glib/gi18n-lib.h>
 +
 +#include <pulse/pulseaudio.h>
 +
 +#include "gvc-channel-map.h"
 +#include "gvc-channel-map-private.h"
 +
 +struct GvcChannelMapPrivate
 +{
 +        pa_channel_map        pa_map;
 +        gboolean              pa_volume_is_set;
 +        pa_cvolume            pa_volume;
 +        gdouble               extern_volume[NUM_TYPES]; /* volume, balance, fade, lfe */
 +        gboolean              can_balance;
 +        gboolean              can_fade;
 +};
 +
 +enum {
 +        VOLUME_CHANGED,
 +        LAST_SIGNAL
 +};
 +
 +static guint signals [LAST_SIGNAL] = { 0, };
 +
 +static void     gvc_channel_map_finalize   (GObject            *object);
 +
 +G_DEFINE_TYPE_WITH_PRIVATE (GvcChannelMap, gvc_channel_map, G_TYPE_OBJECT)
 +
 +guint
 +gvc_channel_map_get_num_channels (const GvcChannelMap *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), 0);
 +
 +        if (!pa_channel_map_valid(&map->priv->pa_map))
 +                return 0;
 +
 +        return map->priv->pa_map.channels;
 +}
 +
 +const gdouble *
 +gvc_channel_map_get_volume (GvcChannelMap *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL);
 +
 +        if (!pa_channel_map_valid(&map->priv->pa_map))
 +                return NULL;
 +
 +        map->priv->extern_volume[VOLUME] = (gdouble) pa_cvolume_max (&map->priv->pa_volume);
 +        if (gvc_channel_map_can_balance (map))
 +                map->priv->extern_volume[BALANCE] = (gdouble) pa_cvolume_get_balance (&map->priv->pa_volume, &map->priv->pa_map);
 +        else
 +                map->priv->extern_volume[BALANCE] = 0;
 +        if (gvc_channel_map_can_fade (map))
 +                map->priv->extern_volume[FADE] = (gdouble) pa_cvolume_get_fade (&map->priv->pa_volume, &map->priv->pa_map);
 +        else
 +                map->priv->extern_volume[FADE] = 0;
 +        if (gvc_channel_map_has_lfe (map))
 +                map->priv->extern_volume[LFE] = (gdouble) pa_cvolume_get_position (&map->priv->pa_volume, &map->priv->pa_map, PA_CHANNEL_POSITION_LFE);
 +        else
 +                map->priv->extern_volume[LFE] = 0;
 +
 +        return map->priv->extern_volume;
 +}
 +
 +gboolean
 +gvc_channel_map_can_balance (const GvcChannelMap  *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE);
 +
 +        return map->priv->can_balance;
 +}
 +
 +gboolean
 +gvc_channel_map_can_fade (const GvcChannelMap  *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE);
 +
 +        return map->priv->can_fade;
 +}
 +
 +const char *
 +gvc_channel_map_get_mapping (const GvcChannelMap  *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL);
 +
 +        if (!pa_channel_map_valid(&map->priv->pa_map))
 +                return NULL;
 +
 +        return pa_channel_map_to_pretty_name (&map->priv->pa_map);
 +}
 +
 +/**
 + * gvc_channel_map_has_position: (skip)
 + * @map:
 + * @position:
 + *
 + * Returns:
 + */
 +gboolean
 +gvc_channel_map_has_position (const GvcChannelMap  *map,
 +                              pa_channel_position_t position)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), FALSE);
 +
 +        return pa_channel_map_has_position (&(map->priv->pa_map), position);
 +}
 +
 +const pa_channel_map *
 +gvc_channel_map_get_pa_channel_map (const GvcChannelMap  *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL);
 +
 +        if (!pa_channel_map_valid(&map->priv->pa_map))
 +                return NULL;
 +
 +        return &map->priv->pa_map;
 +}
 +
 +const pa_cvolume *
 +gvc_channel_map_get_cvolume (const GvcChannelMap  *map)
 +{
 +        g_return_val_if_fail (GVC_IS_CHANNEL_MAP (map), NULL);
 +
 +        if (!pa_channel_map_valid(&map->priv->pa_map))
 +                return NULL;
 +
 +        return &map->priv->pa_volume;
 +}
 +
 +static void
 +gvc_channel_map_class_init (GvcChannelMapClass *klass)
 +{
 +        GObjectClass   *gobject_class = G_OBJECT_CLASS (klass);
 +
 +        gobject_class->finalize = gvc_channel_map_finalize;
 +
 +        signals [VOLUME_CHANGED] =
 +                g_signal_new ("volume-changed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcChannelMapClass, volume_changed),
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
 +}
 +
 +void
 +gvc_channel_map_volume_changed (GvcChannelMap     *map,
 +                                const pa_cvolume  *cv,
 +                                gboolean           set)
 +{
 +        g_return_if_fail (GVC_IS_CHANNEL_MAP (map));
 +        g_return_if_fail (cv != NULL);
 +        g_return_if_fail (pa_cvolume_compatible_with_channel_map(cv, &map->priv->pa_map));
 +
 +        if (pa_cvolume_equal(cv, &map->priv->pa_volume))
 +                return;
 +
 +        map->priv->pa_volume = *cv;
 +
 +        if (map->priv->pa_volume_is_set == FALSE) {
 +                map->priv->pa_volume_is_set = TRUE;
 +                return;
 +        }
 +        g_signal_emit (map, signals[VOLUME_CHANGED], 0, set);
 +}
 +
 +static void
 +gvc_channel_map_init (GvcChannelMap *map)
 +{
 +        map->priv = gvc_channel_map_get_instance_private (map);
 +        map->priv->pa_volume_is_set = FALSE;
 +}
 +
 +static void
 +gvc_channel_map_finalize (GObject *object)
 +{
 +        GvcChannelMap *channel_map;
 +
 +        g_return_if_fail (object != NULL);
 +        g_return_if_fail (GVC_IS_CHANNEL_MAP (object));
 +
 +        channel_map = GVC_CHANNEL_MAP (object);
 +
 +        g_return_if_fail (channel_map->priv != NULL);
 +
 +        G_OBJECT_CLASS (gvc_channel_map_parent_class)->finalize (object);
 +}
 +
 +GvcChannelMap *
 +gvc_channel_map_new (void)
 +{
 +        GObject *map;
 +        map = g_object_new (GVC_TYPE_CHANNEL_MAP, NULL);
 +        return GVC_CHANNEL_MAP (map);
 +}
 +
 +static void
 +set_from_pa_map (GvcChannelMap        *map,
 +                 const pa_channel_map *pa_map)
 +{
 +        g_assert (pa_channel_map_valid(pa_map));
 +
 +        map->priv->can_balance = pa_channel_map_can_balance (pa_map);
 +        map->priv->can_fade = pa_channel_map_can_fade (pa_map);
 +
 +        map->priv->pa_map = *pa_map;
 +        pa_cvolume_set(&map->priv->pa_volume, pa_map->channels, PA_VOLUME_NORM);
 +}
 +
 +GvcChannelMap *
 +gvc_channel_map_new_from_pa_channel_map (const pa_channel_map *pa_map)
 +{
 +        GObject *map;
 +        map = g_object_new (GVC_TYPE_CHANNEL_MAP, NULL);
 +
 +        set_from_pa_map (GVC_CHANNEL_MAP (map), pa_map);
 +
 +        return GVC_CHANNEL_MAP (map);
 +}
index 93be4dad7e5d48f6019f134a043e6e445e559a09,0000000000000000000000000000000000000000..39f59ca582bdaa888dee2431abf6b5b495ca3e08
mode 100644,000000..100644
--- /dev/null
@@@ -1,584 -1,0 +1,574 @@@
-         g_object_notify (G_OBJECT (card), "name");
 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 + *
 + * Copyright (C) 2008 William Jon McCann
 + * Copyright (C) 2009 Bastien Nocera
 + * Copyright (C) Conor Curran 2011 <conor.curran@canonical.com>
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 + *
 + */
 +
 +#include "config.h"
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <unistd.h>
 +
 +#include <glib.h>
 +#include <glib/gi18n-lib.h>
 +
 +#include <pulse/pulseaudio.h>
 +
 +#include "gvc-mixer-card.h"
 +#include "gvc-mixer-card-private.h"
 +
 +static guint32 card_serial = 1;
 +
 +struct GvcMixerCardPrivate
 +{
 +        pa_context    *pa_context;
 +        guint          id;
 +        guint          index;
 +        char          *name;
 +        char          *icon_name;
 +        char          *profile;
 +        char          *target_profile;
 +        char          *human_profile;
 +        GList         *profiles;
 +        pa_operation  *profile_op;
 +        GList         *ports;
 +};
 +
 +enum
 +{
 +        PROP_0,
 +        PROP_ID,
 +        PROP_PA_CONTEXT,
 +        PROP_INDEX,
 +        PROP_NAME,
 +        PROP_ICON_NAME,
 +        PROP_PROFILE,
 +        PROP_HUMAN_PROFILE,
++        N_PROPS
 +};
++static GParamSpec *obj_props[N_PROPS] = { NULL, };
 +
 +static void     gvc_mixer_card_finalize   (GObject            *object);
 +
 +G_DEFINE_TYPE_WITH_PRIVATE (GvcMixerCard, gvc_mixer_card, G_TYPE_OBJECT)
 +
 +static guint32
 +get_next_card_serial (void)
 +{
 +        guint32 serial;
 +
 +        serial = card_serial++;
 +
 +        if ((gint32)card_serial < 0) {
 +                card_serial = 1;
 +        }
 +
 +        return serial;
 +}
 +
 +pa_context *
 +gvc_mixer_card_get_pa_context (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), 0);
 +        return card->priv->pa_context;
 +}
 +
 +guint
 +gvc_mixer_card_get_index (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), 0);
 +        return card->priv->index;
 +}
 +
 +guint
 +gvc_mixer_card_get_id (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), 0);
 +        return card->priv->id;
 +}
 +
 +const char *
 +gvc_mixer_card_get_name (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL);
 +        return card->priv->name;
 +}
 +
 +gboolean
 +gvc_mixer_card_set_name (GvcMixerCard *card,
 +                         const char     *name)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE);
 +
 +        g_free (card->priv->name);
 +        card->priv->name = g_strdup (name);
-         g_object_notify (G_OBJECT (card), "icon-name");
++        g_object_notify_by_pspec (G_OBJECT (card), obj_props[PROP_NAME]);
 +
 +        return TRUE;
 +}
 +
 +const char *
 +gvc_mixer_card_get_icon_name (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL);
 +        return card->priv->icon_name;
 +}
 +
 +gboolean
 +gvc_mixer_card_set_icon_name (GvcMixerCard *card,
 +                              const char     *icon_name)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE);
 +
 +        g_free (card->priv->icon_name);
 +        card->priv->icon_name = g_strdup (icon_name);
-         g_object_notify (G_OBJECT (card), "profile");
++        g_object_notify_by_pspec (G_OBJECT (card), obj_props[PROP_ICON_NAME]);
 +
 +        return TRUE;
 +}
 +
 +/**
 + * gvc_mixer_card_get_profile: (skip)
 + * @card:
 + *
 + * Returns:
 + */
 +GvcMixerCardProfile *
 +gvc_mixer_card_get_profile (GvcMixerCard *card)
 +{
 +        GList *l;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL);
 +        g_return_val_if_fail (card->priv->profiles != NULL, NULL);
 +
 +        for (l = card->priv->profiles; l != NULL; l = l->next) {
 +                GvcMixerCardProfile *p = l->data;
 +                if (g_str_equal (card->priv->profile, p->profile)) {
 +                        return p;
 +                }
 +        }
 +
 +        g_assert_not_reached ();
 +
 +        return NULL;
 +}
 +
 +gboolean
 +gvc_mixer_card_set_profile (GvcMixerCard *card,
 +                            const char     *profile)
 +{
 +        GList *l;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE);
 +        g_return_val_if_fail (card->priv->profiles != NULL, FALSE);
 +
 +        g_free (card->priv->profile);
 +        card->priv->profile = g_strdup (profile);
 +
 +        g_free (card->priv->human_profile);
 +        card->priv->human_profile = NULL;
 +
 +        for (l = card->priv->profiles; l != NULL; l = l->next) {
 +                GvcMixerCardProfile *p = l->data;
 +                if (g_str_equal (card->priv->profile, p->profile)) {
 +                        card->priv->human_profile = g_strdup (p->human_profile);
 +                        break;
 +                }
 +        }
 +
-         g_object_class_install_property (gobject_class,
-                                          PROP_INDEX,
-                                          g_param_spec_ulong ("index",
-                                                              "Index",
-                                                              "The index for this card",
-                                                              0, G_MAXULONG, 0,
-                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-         g_object_class_install_property (gobject_class,
-                                          PROP_ID,
-                                          g_param_spec_ulong ("id",
-                                                              "id",
-                                                              "The id for this card",
-                                                              0, G_MAXULONG, 0,
-                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-         g_object_class_install_property (gobject_class,
-                                          PROP_PA_CONTEXT,
-                                          g_param_spec_pointer ("pa-context",
-                                                                "PulseAudio context",
-                                                                "The PulseAudio context for this card",
-                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-         g_object_class_install_property (gobject_class,
-                                          PROP_NAME,
-                                          g_param_spec_string ("name",
-                                                               "Name",
-                                                               "Name to display for this card",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_ICON_NAME,
-                                          g_param_spec_string ("icon-name",
-                                                               "Icon Name",
-                                                               "Name of icon to display for this card",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_PROFILE,
-                                          g_param_spec_string ("profile",
-                                                               "Profile",
-                                                               "Name of current profile for this card",
-                                                               NULL,
-                                                               G_PARAM_READWRITE));
-         g_object_class_install_property (gobject_class,
-                                          PROP_HUMAN_PROFILE,
-                                          g_param_spec_string ("human-profile",
-                                                               "Profile (Human readable)",
-                                                               "Name of current profile for this card in human readable form",
-                                                               NULL,
-                                                               G_PARAM_READABLE));
++        g_object_notify_by_pspec (G_OBJECT (card), obj_props[PROP_PROFILE]);
 +
 +        return TRUE;
 +}
 +
 +static void
 +_pa_context_set_card_profile_by_index_cb (pa_context                       *context,
 +                                          int                               success,
 +                                          void                             *userdata)
 +{
 +        GvcMixerCard *card = GVC_MIXER_CARD (userdata);
 +
 +        g_assert (card->priv->target_profile);
 +
 +        if (success > 0) {
 +                gvc_mixer_card_set_profile (card, card->priv->target_profile);
 +        } else {
 +                g_debug ("Failed to switch profile on '%s' from '%s' to '%s'",
 +                         card->priv->name,
 +                         card->priv->profile,
 +                         card->priv->target_profile);
 +        }
 +        g_free (card->priv->target_profile);
 +        card->priv->target_profile = NULL;
 +
 +        pa_operation_unref (card->priv->profile_op);
 +        card->priv->profile_op = NULL;
 +}
 +
 +/**
 + * gvc_mixer_card_change_profile:
 + * @card: a #GvcMixerCard
 + * @profile: (allow-none): the profile to change to or %NULL.
 + *
 + * Change the profile in use on this card.
 + *
 + * Returns: %TRUE if profile successfully changed or already using this profile.
 + */
 +gboolean
 +gvc_mixer_card_change_profile (GvcMixerCard *card,
 +                               const char *profile)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE);
 +        g_return_val_if_fail (card->priv->profiles != NULL, FALSE);
 +
 +        /* Same profile, or already requested? */
 +        if (g_strcmp0 (card->priv->profile, profile) == 0)
 +                return TRUE;
 +        if (g_strcmp0 (profile, card->priv->target_profile) == 0)
 +                return TRUE;
 +        if (card->priv->profile_op != NULL) {
 +                pa_operation_cancel (card->priv->profile_op);
 +                pa_operation_unref (card->priv->profile_op);
 +                card->priv->profile_op = NULL;
 +        }
 +
 +        if (card->priv->profile != NULL) {
 +                g_free (card->priv->target_profile);
 +                card->priv->target_profile = g_strdup (profile);
 +
 +                card->priv->profile_op = pa_context_set_card_profile_by_index (card->priv->pa_context,
 +                                                                               card->priv->index,
 +                                                                               card->priv->target_profile,
 +                                                                               _pa_context_set_card_profile_by_index_cb,
 +                                                                               card);
 +
 +                if (card->priv->profile_op == NULL) {
 +                        g_warning ("pa_context_set_card_profile_by_index() failed");
 +                        return FALSE;
 +                }
 +        } else {
 +                g_assert (card->priv->human_profile == NULL);
 +                card->priv->profile = g_strdup (profile);
 +        }
 +
 +        return TRUE;
 +}
 +
 +/**
 + * gvc_mixer_card_get_profiles:
 + *
 + * Return value: (transfer none) (element-type GvcMixerCardProfile):
 + */
 +const GList *
 +gvc_mixer_card_get_profiles (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL);
 +        return card->priv->profiles;
 +}
 +
 +/**
 + * gvc_mixer_card_get_ports:
 + *
 + * Return value: (transfer none) (element-type GvcMixerCardPort):
 + */
 +const GList *
 +gvc_mixer_card_get_ports (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL);
 +        return card->priv->ports;
 +}
 +
 +/**
 + * gvc_mixer_card_profile_compare:
 + *
 + * Return value: 1 if @a has a higher priority, -1 if @b has a higher
 + * priority, 0 if @a and @b have the same priority.
 + */
 +int
 +gvc_mixer_card_profile_compare (GvcMixerCardProfile *a,
 +                                GvcMixerCardProfile *b)
 +{
 +        if (a->priority == b->priority)
 +                return 0;
 +        if (a->priority > b->priority)
 +                return 1;
 +        return -1;
 +}
 +
 +/**
 + * gvc_mixer_card_set_profiles:
 + * @profiles: (transfer full) (element-type GvcMixerCardProfile):
 + */
 +gboolean
 +gvc_mixer_card_set_profiles (GvcMixerCard *card,
 +                             GList        *profiles)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE);
 +        g_return_val_if_fail (card->priv->profiles == NULL, FALSE);
 +
 +        card->priv->profiles = g_list_sort (profiles, (GCompareFunc) gvc_mixer_card_profile_compare);
 +
 +        return TRUE;
 +}
 +
 +/**
 + * gvc_mixer_card_get_gicon:
 + * @card:
 + *
 + * Return value: (transfer full):
 + */
 +GIcon *
 +gvc_mixer_card_get_gicon (GvcMixerCard *card)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), NULL);
 +
 +        if (card->priv->icon_name == NULL)
 +                return NULL;
 +
 +        return g_themed_icon_new_with_default_fallbacks (card->priv->icon_name);
 +}
 +
 +static void
 +free_port (GvcMixerCardPort *port)
 +{
 +        g_free (port->port);
 +        g_free (port->human_port);
 +        g_free (port->icon_name);
 +        g_list_free (port->profiles);
 +
 +        g_free (port);
 +}
 +
 +/**
 + * gvc_mixer_card_set_ports:
 + * @ports: (transfer full) (element-type GvcMixerCardPort):
 + */
 +gboolean
 +gvc_mixer_card_set_ports (GvcMixerCard *card,
 +                          GList        *ports)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CARD (card), FALSE);
 +        g_return_val_if_fail (card->priv->ports == NULL, FALSE);
 +
 +        g_list_free_full (card->priv->ports, (GDestroyNotify) free_port);
 +        card->priv->ports = ports;
 +
 +        return TRUE;
 +}
 +
 +static void
 +gvc_mixer_card_set_property (GObject       *object,
 +                             guint          prop_id,
 +                             const GValue  *value,
 +                             GParamSpec    *pspec)
 +{
 +        GvcMixerCard *self = GVC_MIXER_CARD (object);
 +
 +        switch (prop_id) {
 +        case PROP_PA_CONTEXT:
 +                self->priv->pa_context = g_value_get_pointer (value);
 +                break;
 +        case PROP_INDEX:
 +                self->priv->index = g_value_get_ulong (value);
 +                break;
 +        case PROP_ID:
 +                self->priv->id = g_value_get_ulong (value);
 +                break;
 +        case PROP_NAME:
 +                gvc_mixer_card_set_name (self, g_value_get_string (value));
 +                break;
 +        case PROP_ICON_NAME:
 +                gvc_mixer_card_set_icon_name (self, g_value_get_string (value));
 +                break;
 +        case PROP_PROFILE:
 +                gvc_mixer_card_set_profile (self, g_value_get_string (value));
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_card_get_property (GObject     *object,
 +                             guint        prop_id,
 +                             GValue      *value,
 +                             GParamSpec  *pspec)
 +{
 +        GvcMixerCard *self = GVC_MIXER_CARD (object);
 +
 +        switch (prop_id) {
 +        case PROP_PA_CONTEXT:
 +                g_value_set_pointer (value, self->priv->pa_context);
 +                break;
 +        case PROP_INDEX:
 +                g_value_set_ulong (value, self->priv->index);
 +                break;
 +        case PROP_ID:
 +                g_value_set_ulong (value, self->priv->id);
 +                break;
 +        case PROP_NAME:
 +                g_value_set_string (value, self->priv->name);
 +                break;
 +        case PROP_ICON_NAME:
 +                g_value_set_string (value, self->priv->icon_name);
 +                break;
 +        case PROP_PROFILE:
 +                g_value_set_string (value, self->priv->profile);
 +                break;
 +        case PROP_HUMAN_PROFILE:
 +                g_value_set_string (value, self->priv->human_profile);
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static GObject *
 +gvc_mixer_card_constructor (GType                  type,
 +                            guint                  n_construct_properties,
 +                            GObjectConstructParam *construct_params)
 +{
 +        GObject       *object;
 +        GvcMixerCard *self;
 +
 +        object = G_OBJECT_CLASS (gvc_mixer_card_parent_class)->constructor (type, n_construct_properties, construct_params);
 +
 +        self = GVC_MIXER_CARD (object);
 +
 +        self->priv->id = get_next_card_serial ();
 +
 +        return object;
 +}
 +
 +static void
 +gvc_mixer_card_class_init (GvcMixerCardClass *klass)
 +{
 +        GObjectClass   *gobject_class = G_OBJECT_CLASS (klass);
 +
 +        gobject_class->constructor = gvc_mixer_card_constructor;
 +        gobject_class->finalize = gvc_mixer_card_finalize;
 +
 +        gobject_class->set_property = gvc_mixer_card_set_property;
 +        gobject_class->get_property = gvc_mixer_card_get_property;
 +
++        obj_props[PROP_INDEX] = g_param_spec_ulong ("index",
++                                                    "Index",
++                                                    "The index for this card",
++                                                    0, G_MAXULONG, 0,
++                                                    G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_ID] = g_param_spec_ulong ("id",
++                                                 "id",
++                                                 "The id for this card",
++                                                 0, G_MAXULONG, 0,
++                                                 G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_PA_CONTEXT] = g_param_spec_pointer ("pa-context",
++                                                           "PulseAudio context",
++                                                           "The PulseAudio context for this card",
++                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_NAME] = g_param_spec_string ("name",
++                                                    "Name",
++                                                    "Name to display for this card",
++                                                    NULL,
++                                                    G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_ICON_NAME] = g_param_spec_string ("icon-name",
++                                                         "Icon Name",
++                                                         "Name of icon to display for this card",
++                                                         NULL,
++                                                         G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_PROFILE] = g_param_spec_string ("profile",
++                                                       "Profile",
++                                                       "Name of current profile for this card",
++                                                       NULL,
++                                                       G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_HUMAN_PROFILE] = g_param_spec_string ("human-profile",
++                                                             "Profile (Human readable)",
++                                                             "Name of current profile for this card in human readable form",
++                                                             NULL,
++                                                             G_PARAM_READABLE|G_PARAM_STATIC_STRINGS);
++
++        g_object_class_install_properties (gobject_class, N_PROPS, obj_props);
 +}
 +
 +static void
 +gvc_mixer_card_init (GvcMixerCard *card)
 +{
 +        card->priv = gvc_mixer_card_get_instance_private (card);
 +}
 +
 +GvcMixerCard *
 +gvc_mixer_card_new (pa_context *context,
 +                    guint       index)
 +{
 +        GObject *object;
 +
 +        object = g_object_new (GVC_TYPE_MIXER_CARD,
 +                               "index", index,
 +                               "pa-context", context,
 +                               NULL);
 +        return GVC_MIXER_CARD (object);
 +}
 +
 +static void
 +free_profile (GvcMixerCardProfile *p)
 +{
 +        g_free (p->profile);
 +        g_free (p->human_profile);
 +        g_free (p->status);
 +        g_free (p);
 +}
 +
 +static void
 +gvc_mixer_card_finalize (GObject *object)
 +{
 +        GvcMixerCard *mixer_card;
 +
 +        g_return_if_fail (object != NULL);
 +        g_return_if_fail (GVC_IS_MIXER_CARD (object));
 +
 +        mixer_card = GVC_MIXER_CARD (object);
 +
 +        g_return_if_fail (mixer_card->priv != NULL);
 +
 +        g_free (mixer_card->priv->name);
 +        mixer_card->priv->name = NULL;
 +
 +        g_free (mixer_card->priv->icon_name);
 +        mixer_card->priv->icon_name = NULL;
 +
 +        g_free (mixer_card->priv->target_profile);
 +        mixer_card->priv->target_profile = NULL;
 +
 +        g_free (mixer_card->priv->profile);
 +        mixer_card->priv->profile = NULL;
 +
 +        g_free (mixer_card->priv->human_profile);
 +        mixer_card->priv->human_profile = NULL;
 +
 +        g_list_free_full (mixer_card->priv->profiles, (GDestroyNotify) free_profile);
 +        mixer_card->priv->profiles = NULL;
 +
 +        g_list_free_full (mixer_card->priv->ports, (GDestroyNotify) free_port);
 +        mixer_card->priv->ports = NULL;
 +
 +        G_OBJECT_CLASS (gvc_mixer_card_parent_class)->finalize (object);
 +}
 +
index 6218a1ba70c36c94d97477cbbe64833977f66ab0,0000000000000000000000000000000000000000..b603b77137ed8fcb5dc491bc6e011f1dc8cef29c
mode 100644,000000..100644
--- /dev/null
@@@ -1,3885 -1,0 +1,3881 @@@
-         PROP_NAME
 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 + *
 + * Copyright (C) 2006-2008 Lennart Poettering
 + * Copyright (C) 2008 Sjoerd Simons <sjoerd@luon.net>
 + * Copyright (C) 2008 William Jon McCann
 + * Copyright (C) 2012 Conor Curran
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 + *
 + */
 +
 +#include "config.h"
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <unistd.h>
 +
 +#include <glib.h>
 +#include <glib/gi18n-lib.h>
 +
 +#include <pulse/pulseaudio.h>
 +#include <pulse/glib-mainloop.h>
 +#include <pulse/ext-stream-restore.h>
 +
 +#ifdef HAVE_ALSA
 +#include <alsa/asoundlib.h>
 +#endif /* HAVE_ALSA */
 +
 +#include "gvc-mixer-control.h"
 +#include "gvc-mixer-sink.h"
 +#include "gvc-mixer-source.h"
 +#include "gvc-mixer-sink-input.h"
 +#include "gvc-mixer-source-output.h"
 +#include "gvc-mixer-event-role.h"
 +#include "gvc-mixer-card.h"
 +#include "gvc-mixer-card-private.h"
 +#include "gvc-channel-map-private.h"
 +#include "gvc-mixer-control-private.h"
 +#include "gvc-mixer-ui-device.h"
 +
 +#define RECONNECT_DELAY 5
 +
 +enum {
 +        PROP_0,
-                 gint              device_stream_id;
++        PROP_NAME,
++        N_PROPS
 +};
++static GParamSpec *obj_props[N_PROPS] = { NULL, };
 +
 +struct GvcMixerControlPrivate
 +{
 +        pa_glib_mainloop *pa_mainloop;
 +        pa_mainloop_api  *pa_api;
 +        pa_context       *pa_context;
 +        guint             server_protocol_version;
 +        int               n_outstanding;
 +        guint             reconnect_id;
 +        char             *name;
 +
 +        gboolean          default_sink_is_set;
 +        guint             default_sink_id;
 +        char             *default_sink_name;
 +        gboolean          default_source_is_set;
 +        guint             default_source_id;
 +        char             *default_source_name;
 +
 +        gboolean          event_sink_input_is_set;
 +        guint             event_sink_input_id;
 +
 +        GHashTable       *all_streams;
 +        GHashTable       *sinks; /* fixed outputs */
 +        GHashTable       *sources; /* fixed inputs */
 +        GHashTable       *sink_inputs; /* routable output streams */
 +        GHashTable       *source_outputs; /* routable input streams */
 +        GHashTable       *clients;
 +        GHashTable       *cards;
 +
 +        GvcMixerStream   *new_default_sink_stream; /* new default sink stream, used in gvc_mixer_control_set_default_sink () */
 +        GvcMixerStream   *new_default_source_stream; /* new default source stream, used in gvc_mixer_control_set_default_source () */
 +
 +        GHashTable       *ui_outputs; /* UI visible outputs */
 +        GHashTable       *ui_inputs;  /* UI visible inputs */
 +
 +        /* When we change profile on a device that is not the server default sink,
 +         * it will jump back to the default sink set by the server to prevent the
 +         * audio setup from being 'outputless'.
 +         *
 +         * All well and good but then when we get the new stream created for the
 +         * new profile how do we know that this is the intended default or selected
 +         * device the user wishes to use. */
 +        guint            profile_swapping_device_id;
 +
 +#ifdef HAVE_ALSA
 +        int      headset_card;
 +        gboolean has_headsetmic;
 +        gboolean has_headphonemic;
 +        gboolean headset_plugged_in;
 +        char    *headphones_name;
 +        char    *headsetmic_name;
 +        char    *headphonemic_name;
 +        char    *internalspk_name;
 +        char    *internalmic_name;
 +#endif /* HAVE_ALSA */
 +
 +        GvcMixerControlState state;
 +};
 +
 +enum {
 +        STATE_CHANGED,
 +        STREAM_ADDED,
 +        STREAM_REMOVED,
 +        STREAM_CHANGED,
 +        CARD_ADDED,
 +        CARD_REMOVED,
 +        DEFAULT_SINK_CHANGED,
 +        DEFAULT_SOURCE_CHANGED,
 +        ACTIVE_OUTPUT_UPDATE,
 +        ACTIVE_INPUT_UPDATE,
 +        OUTPUT_ADDED,
 +        INPUT_ADDED,
 +        OUTPUT_REMOVED,
 +        INPUT_REMOVED,
 +        AUDIO_DEVICE_SELECTION_NEEDED,
 +        LAST_SIGNAL
 +};
 +
 +static guint signals [LAST_SIGNAL] = { 0, };
 +
 +static void     gvc_mixer_control_finalize   (GObject              *object);
 +
 +G_DEFINE_TYPE_WITH_PRIVATE (GvcMixerControl, gvc_mixer_control, G_TYPE_OBJECT)
 +
 +pa_context *
 +gvc_mixer_control_get_pa_context (GvcMixerControl *control)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +        return control->priv->pa_context;
 +}
 +
 +/**
 + * gvc_mixer_control_get_event_sink_input:
 + * @control:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerStream *
 +gvc_mixer_control_get_event_sink_input (GvcMixerControl *control)
 +{
 +        GvcMixerStream *stream;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        stream = g_hash_table_lookup (control->priv->all_streams,
 +                                      GUINT_TO_POINTER (control->priv->event_sink_input_id));
 +
 +        return stream;
 +}
 +
 +static void
 +gvc_mixer_control_stream_restore_cb (pa_context *c,
 +                                   GvcMixerStream *new_stream,
 +                                     const pa_ext_stream_restore_info *info,
 +                                     GvcMixerControl *control)
 +{
 +        pa_operation *o;
 +        pa_ext_stream_restore_info new_info;
 +
 +        if (new_stream == NULL)
 +                return;
 +
 +        new_info.name = info->name;
 +        new_info.channel_map = info->channel_map;
 +        new_info.volume = info->volume;
 +        new_info.mute = info->mute;
 +
 +        new_info.device = gvc_mixer_stream_get_name (new_stream);
 +
 +        o = pa_ext_stream_restore_write (control->priv->pa_context,
 +                                         PA_UPDATE_REPLACE,
 +                                         &new_info, 1,
 +                                         TRUE, NULL, NULL);
 +
 +        if (o == NULL) {
 +                g_warning ("pa_ext_stream_restore_write() failed: %s",
 +                           pa_strerror (pa_context_errno (control->priv->pa_context)));
 +                return;
 +        }
 +
 +        g_debug ("Changed default device for %s to %s", info->name, new_info.device);
 +
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +gvc_mixer_control_stream_restore_sink_cb (pa_context *c,
 +                                          const pa_ext_stream_restore_info *info,
 +                                          int eol,
 +                                          void *userdata)
 +{
 +        GvcMixerControl *control = (GvcMixerControl *) userdata;
 +        if (eol || info == NULL || !g_str_has_prefix(info->name, "sink-input-by"))
 +                return;
 +        gvc_mixer_control_stream_restore_cb (c, control->priv->new_default_sink_stream, info, control);
 +}
 +
 +static void
 +gvc_mixer_control_stream_restore_source_cb (pa_context *c,
 +                                            const pa_ext_stream_restore_info *info,
 +                                            int eol,
 +                                            void *userdata)
 +{
 +        GvcMixerControl *control = (GvcMixerControl *) userdata;
 +        if (eol || info == NULL || !g_str_has_prefix(info->name, "source-output-by"))
 +                return;
 +        gvc_mixer_control_stream_restore_cb (c, control->priv->new_default_source_stream, info, control);
 +}
 +
 +/**
 + * gvc_mixer_control_lookup_device_from_stream:
 + * @control:
 + * @stream:
 + *
 + * Returns: (transfer none): a #GvcUIDevice or %NULL
 + */
 +GvcMixerUIDevice *
 +gvc_mixer_control_lookup_device_from_stream (GvcMixerControl *control,
 +                                             GvcMixerStream *stream)
 +{
 +        GList                   *devices, *d;
 +        gboolean                 is_network_stream;
 +        const GList             *ports;
 +        GvcMixerUIDevice        *ret;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +
 +        if (GVC_IS_MIXER_SOURCE (stream))
 +               devices = g_hash_table_get_values (control->priv->ui_inputs);
 +        else
 +               devices = g_hash_table_get_values (control->priv->ui_outputs);
 +
 +        ret = NULL;
 +        ports = gvc_mixer_stream_get_ports (stream);
 +        is_network_stream = (ports == NULL);
 +
 +        for (d = devices; d != NULL; d = d->next) {
 +                GvcMixerUIDevice *device = d->data;
 +                guint stream_id = G_MAXUINT;
 +
 +                g_object_get (G_OBJECT (device),
 +                             "stream-id", &stream_id,
 +                              NULL);
 +
 +                if (is_network_stream &&
 +                    stream_id == gvc_mixer_stream_get_id (stream)) {
 +                        g_debug ("lookup device from stream - %s - it is a network_stream ",
 +                                 gvc_mixer_ui_device_get_description (device));
 +                        ret = device;
 +                        break;
 +                } else if (!is_network_stream) {
 +                        const GvcMixerStreamPort *port;
 +                        port = gvc_mixer_stream_get_port (stream);
 +
 +                        if (stream_id == gvc_mixer_stream_get_id (stream) &&
 +                            g_strcmp0 (gvc_mixer_ui_device_get_port (device),
 +                                       port->port) == 0) {
 +                                g_debug ("lookup-device-from-stream found device: device description '%s', device port = '%s', device stream id %i AND stream port = '%s' stream id '%u' and stream description '%s'",
 +                                         gvc_mixer_ui_device_get_description (device),
 +                                         gvc_mixer_ui_device_get_port (device),
 +                                         stream_id,
 +                                         port->port,
 +                                         gvc_mixer_stream_get_id (stream),
 +                                         gvc_mixer_stream_get_description (stream));
 +                                ret = device;
 +                                break;
 +                        }
 +                }
 +        }
 +
 +        g_debug ("gvc_mixer_control_lookup_device_from_stream - Could not find a device for stream '%s'",gvc_mixer_stream_get_description (stream));
 +
 +        g_list_free (devices);
 +
 +        return ret;
 +}
 +
 +gboolean
 +gvc_mixer_control_set_default_sink (GvcMixerControl *control,
 +                                    GvcMixerStream  *stream)
 +{
 +        pa_operation *o;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE);
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_debug ("about to set default sink on server");
 +        o = pa_context_set_default_sink (control->priv->pa_context,
 +                                         gvc_mixer_stream_get_name (stream),
 +                                         NULL,
 +                                         NULL);
 +        if (o == NULL) {
 +                g_warning ("pa_context_set_default_sink() failed: %s",
 +                           pa_strerror (pa_context_errno (control->priv->pa_context)));
 +                return FALSE;
 +        }
 +
 +        pa_operation_unref (o);
 +
 +        control->priv->new_default_sink_stream = stream;
 +        g_object_add_weak_pointer (G_OBJECT (stream), (gpointer *) &control->priv->new_default_sink_stream);
 +
 +        o = pa_ext_stream_restore_read (control->priv->pa_context,
 +                                        gvc_mixer_control_stream_restore_sink_cb,
 +                                        control);
 +
 +        if (o == NULL) {
 +                g_warning ("pa_ext_stream_restore_read() failed: %s",
 +                           pa_strerror (pa_context_errno (control->priv->pa_context)));
 +                return FALSE;
 +        }
 +
 +        pa_operation_unref (o);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_control_set_default_source (GvcMixerControl *control,
 +                                      GvcMixerStream  *stream)
 +{
 +        GvcMixerUIDevice* input;
 +        pa_operation *o;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE);
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        o = pa_context_set_default_source (control->priv->pa_context,
 +                                           gvc_mixer_stream_get_name (stream),
 +                                           NULL,
 +                                           NULL);
 +        if (o == NULL) {
 +                g_warning ("pa_context_set_default_source() failed");
 +                return FALSE;
 +        }
 +
 +        pa_operation_unref (o);
 +
 +        control->priv->new_default_source_stream = stream;
 +        g_object_add_weak_pointer (G_OBJECT (stream), (gpointer *) &control->priv->new_default_source_stream);
 +
 +        o = pa_ext_stream_restore_read (control->priv->pa_context,
 +                                        gvc_mixer_control_stream_restore_source_cb,
 +                                        control);
 +
 +        if (o == NULL) {
 +                g_warning ("pa_ext_stream_restore_read() failed: %s",
 +                           pa_strerror (pa_context_errno (control->priv->pa_context)));
 +                return FALSE;
 +        }
 +
 +        pa_operation_unref (o);
 +
 +        /* source change successful, update the UI. */
 +        input = gvc_mixer_control_lookup_device_from_stream (control, stream);
 +        g_signal_emit (G_OBJECT (control),
 +                       signals[ACTIVE_INPUT_UPDATE],
 +                       0,
 +                       gvc_mixer_ui_device_get_id (input));
 +
 +        return TRUE;
 +}
 +
 +/**
 + * gvc_mixer_control_get_default_sink:
 + * @control:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerStream *
 +gvc_mixer_control_get_default_sink (GvcMixerControl *control)
 +{
 +        GvcMixerStream *stream;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        if (control->priv->default_sink_is_set) {
 +                stream = g_hash_table_lookup (control->priv->all_streams,
 +                                              GUINT_TO_POINTER (control->priv->default_sink_id));
 +        } else {
 +                stream = NULL;
 +        }
 +
 +        return stream;
 +}
 +
 +/**
 + * gvc_mixer_control_get_default_source:
 + * @control:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerStream *
 +gvc_mixer_control_get_default_source (GvcMixerControl *control)
 +{
 +        GvcMixerStream *stream;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        if (control->priv->default_source_is_set) {
 +                stream = g_hash_table_lookup (control->priv->all_streams,
 +                                              GUINT_TO_POINTER (control->priv->default_source_id));
 +        } else {
 +                stream = NULL;
 +        }
 +
 +        return stream;
 +}
 +
 +static gpointer
 +gvc_mixer_control_lookup_id (GHashTable *hash_table,
 +                             guint       id)
 +{
 +        return g_hash_table_lookup (hash_table,
 +                                    GUINT_TO_POINTER (id));
 +}
 +
 +/**
 + * gvc_mixer_control_lookup_stream_id:
 + * @control:
 + * @id:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerStream *
 +gvc_mixer_control_lookup_stream_id (GvcMixerControl *control,
 +                                    guint            id)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        return gvc_mixer_control_lookup_id (control->priv->all_streams, id);
 +}
 +
 +/**
 + * gvc_mixer_control_lookup_card_id:
 + * @control:
 + * @id:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerCard *
 +gvc_mixer_control_lookup_card_id (GvcMixerControl *control,
 +                                  guint            id)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        return gvc_mixer_control_lookup_id (control->priv->cards, id);
 +}
 +
 +/**
 + * gvc_mixer_control_lookup_output_id:
 + * @control:
 + * @id:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerUIDevice *
 +gvc_mixer_control_lookup_output_id (GvcMixerControl *control,
 +                                    guint            id)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        return gvc_mixer_control_lookup_id (control->priv->ui_outputs, id);
 +}
 +
 +/**
 + * gvc_mixer_control_lookup_input_id:
 + * @control:
 + * @id:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerUIDevice *
 +gvc_mixer_control_lookup_input_id (GvcMixerControl *control,
 +                                    guint            id)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        return gvc_mixer_control_lookup_id (control->priv->ui_inputs, id);
 +}
 +
 +/**
 + * gvc_mixer_control_get_stream_from_device:
 + * @control:
 + * @device:
 + *
 + * Returns: (transfer none):
 + */
 +GvcMixerStream *
 +gvc_mixer_control_get_stream_from_device (GvcMixerControl *control,
 +                                          GvcMixerUIDevice *device)
 +{
 +        gint stream_id;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        stream_id = gvc_mixer_ui_device_get_stream_id (device);
 +
 +        if (stream_id == GVC_MIXER_UI_DEVICE_INVALID) {
 +                g_debug ("gvc_mixer_control_get_stream_from_device - device has a null stream");
 +                return NULL;
 +        }
 +        return gvc_mixer_control_lookup_stream_id (control, stream_id);
 +}
 +
 +/**
 + * gvc_mixer_control_change_profile_on_selected_device:
 + * @control:
 + * @device:
 + * @profile: (allow-none): Can be %NULL if any profile present on this port is okay
 + *
 + * Returns: This method will attempt to swap the profile on the card of
 + * the device with given profile name.  If successfull it will set the
 + * preferred profile on that device so as we know the next time the user
 + * moves to that device it should have this profile active.
 + */
 +gboolean
 +gvc_mixer_control_change_profile_on_selected_device (GvcMixerControl  *control,
 +                                                     GvcMixerUIDevice *device,
 +                                                     const gchar      *profile)
 +{
 +        const gchar         *best_profile;
 +        GvcMixerCardProfile *current_profile;
 +        GvcMixerCard        *card;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE);
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), FALSE);
 +
 +        g_object_get (G_OBJECT (device), "card", &card, NULL);
 +        current_profile = gvc_mixer_card_get_profile (card);
 +
 +        if (current_profile)
 +                best_profile = gvc_mixer_ui_device_get_best_profile (device, profile, current_profile->profile);
 +        else
 +                best_profile = profile;
 +
 +        g_assert (best_profile);
 +
 +        g_debug ("Selected '%s', moving to profile '%s' on card '%s' on stream id %i",
 +                profile ? profile : "(any)", best_profile,
 +                gvc_mixer_card_get_name (card),
 +                gvc_mixer_ui_device_get_stream_id (device));
 +
 +        g_debug ("default sink name = %s and default sink id %u",
 +                 control->priv->default_sink_name,
 +                 control->priv->default_sink_id);
 +
 +        control->priv->profile_swapping_device_id = gvc_mixer_ui_device_get_id (device);
 +
 +        if (gvc_mixer_card_change_profile (card, best_profile)) {
 +                gvc_mixer_ui_device_set_user_preferred_profile (device, best_profile);
 +                return TRUE;
 +        }
 +        return FALSE;
 +}
 +
 +/**
 + * gvc_mixer_control_change_output:
 + * @control:
 + * @output:
 + * This method is called from the UI when the user selects a previously unselected device.
 + * - Firstly it queries the stream from the device.
 + *   - It assumes that if the stream is null that it cannot be a bluetooth or network stream (they never show unless they have valid sinks and sources)
 + *   In the scenario of a NULL stream on the device
 + *        - It fetches the device's preferred profile or if NUll the profile with the highest priority on that device.
 + *        - It then caches this device in control->priv->cached_desired_output_id so that when the update_sink triggered
 + *          from when we attempt to change profile we will know exactly what device to highlight on that stream.
 + *        - It attempts to swap the profile on the card from that device and returns.
 + * - Next, it handles network or bluetooth streams that only require their stream to be made the default.
 + * - Next it deals with port changes so if the stream's active port is not the same as the port on the device
 + *   it will attempt to change the port on that stream to be same as the device. If this fails it will return.
 + * - Finally it will set this new stream to be the default stream and emit a signal for the UI confirming the active output device.
 + */
 +void
 +gvc_mixer_control_change_output (GvcMixerControl *control,
 +                                 GvcMixerUIDevice* output)
 +{
 +        GvcMixerStream           *stream;
 +        GvcMixerStream           *default_stream;
 +        const GvcMixerStreamPort *active_port;
 +        const gchar              *output_port;
 +
 +        g_return_if_fail (GVC_IS_MIXER_CONTROL (control));
 +        g_return_if_fail (GVC_IS_MIXER_UI_DEVICE (output));
 +
 +        g_debug ("control change output");
 +
 +        stream = gvc_mixer_control_get_stream_from_device (control, output);
 +        if (stream == NULL) {
 +                gvc_mixer_control_change_profile_on_selected_device (control,
 +                        output, NULL);
 +                return;
 +        }
 +
 +        /* Handle a network sink as a portless or cardless device */
 +        if (!gvc_mixer_ui_device_has_ports (output)) {
 +                g_debug ("Did we try to move to a software/bluetooth sink ?");
 +                if (gvc_mixer_control_set_default_sink (control, stream)) {
 +                        /* sink change was successful,  update the UI.*/
 +                        g_signal_emit (G_OBJECT (control),
 +                                       signals[ACTIVE_OUTPUT_UPDATE],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (output));
 +                }
 +                else {
 +                        g_warning ("Failed to set default sink with stream from output %s",
 +                                   gvc_mixer_ui_device_get_description (output));
 +                }
 +                return;
 +        }
 +
 +        active_port = gvc_mixer_stream_get_port (stream);
 +        output_port = gvc_mixer_ui_device_get_port (output);
 +        /* First ensure the correct port is active on the sink */
 +        if (g_strcmp0 (active_port->port, output_port) != 0) {
 +                g_debug ("Port change, switch to = %s", output_port);
 +                if (gvc_mixer_stream_change_port (stream, output_port) == FALSE) {
 +                        g_warning ("Could not change port !");
 +                        return;
 +                }
 +        }
 +
 +        default_stream = gvc_mixer_control_get_default_sink (control);
 +
 +        /* Finally if we are not on the correct stream, swap over. */
 +        if (stream != default_stream) {
 +                GvcMixerUIDevice* device;
 +
 +                g_debug ("Attempting to swap over to stream %s ",
 +                         gvc_mixer_stream_get_description (stream));
 +                if (gvc_mixer_control_set_default_sink (control, stream)) {
 +                        device = gvc_mixer_control_lookup_device_from_stream (control, stream);
 +                        g_signal_emit (G_OBJECT (control),
 +                                       signals[ACTIVE_OUTPUT_UPDATE],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (device));
 +                } else {
 +                        /* If the move failed for some reason reset the UI. */
 +                        device = gvc_mixer_control_lookup_device_from_stream (control, default_stream);
 +                        g_signal_emit (G_OBJECT (control),
 +                                       signals[ACTIVE_OUTPUT_UPDATE],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (device));
 +                }
 +        }
 +}
 +
 +
 +/**
 + * gvc_mixer_control_change_input:
 + * @control:
 + * @input:
 + * This method is called from the UI when the user selects a previously unselected device.
 + * - Firstly it queries the stream from the device.
 + *   - It assumes that if the stream is null that it cannot be a bluetooth or network stream (they never show unless they have valid sinks and sources)
 + *   In the scenario of a NULL stream on the device
 + *        - It fetches the device's preferred profile or if NUll the profile with the highest priority on that device.
 + *        - It then caches this device in control->priv->cached_desired_input_id so that when the update_source triggered
 + *          from when we attempt to change profile we will know exactly what device to highlight on that stream.
 + *        - It attempts to swap the profile on the card from that device and returns.
 + * - Next, it handles network or bluetooth streams that only require their stream to be made the default.
 + * - Next it deals with port changes so if the stream's active port is not the same as the port on the device
 + *   it will attempt to change the port on that stream to be same as the device. If this fails it will return.
 + * - Finally it will set this new stream to be the default stream and emit a signal for the UI confirming the active input device.
 + */
 +void
 +gvc_mixer_control_change_input (GvcMixerControl *control,
 +                                GvcMixerUIDevice* input)
 +{
 +        GvcMixerStream           *stream;
 +        GvcMixerStream           *default_stream;
 +        const GvcMixerStreamPort *active_port;
 +        const gchar              *input_port;
 +
 +        g_return_if_fail (GVC_IS_MIXER_CONTROL (control));
 +        g_return_if_fail (GVC_IS_MIXER_UI_DEVICE (input));
 +
 +        stream = gvc_mixer_control_get_stream_from_device (control, input);
 +        if (stream == NULL) {
 +                gvc_mixer_control_change_profile_on_selected_device (control,
 +                        input, NULL);
 +                return;
 +        }
 +
 +        /* Handle a network sink as a portless/cardless device */
 +        if (!gvc_mixer_ui_device_has_ports (input)) {
 +                g_debug ("Did we try to move to a software/bluetooth source ?");
 +                if (! gvc_mixer_control_set_default_source (control, stream)) {
 +                        g_warning ("Failed to set default source with stream from input %s",
 +                                   gvc_mixer_ui_device_get_description (input));
 +                }
 +                return;
 +        }
 +
 +        active_port = gvc_mixer_stream_get_port (stream);
 +        input_port = gvc_mixer_ui_device_get_port (input);
 +        /* First ensure the correct port is active on the sink */
 +        if (g_strcmp0 (active_port->port, input_port) != 0) {
 +                g_debug ("Port change, switch to = %s", input_port);
 +                if (gvc_mixer_stream_change_port (stream, input_port) == FALSE) {
 +                        g_warning ("Could not change port!");
 +                        return;
 +                }
 +        }
 +
 +        default_stream = gvc_mixer_control_get_default_source (control);
 +
 +        /* Finally if we are not on the correct stream, swap over. */
 +        if (stream != default_stream) {
 +                g_debug ("change-input - attempting to swap over to stream %s",
 +                         gvc_mixer_stream_get_description (stream));
 +                gvc_mixer_control_set_default_source (control, stream);
 +        }
 +}
 +
 +
 +static void
 +listify_hash_values_hfunc (gpointer key,
 +                           gpointer value,
 +                           gpointer user_data)
 +{
 +        GSList **list = user_data;
 +
 +        *list = g_slist_prepend (*list, value);
 +}
 +
 +static int
 +gvc_name_collate (const char *namea,
 +                  const char *nameb)
 +{
 +        if (nameb == NULL && namea == NULL)
 +                return 0;
 +        if (nameb == NULL)
 +                return 1;
 +        if (namea == NULL)
 +                return -1;
 +
 +        return g_utf8_collate (namea, nameb);
 +}
 +
 +static int
 +gvc_card_collate (GvcMixerCard *a,
 +                  GvcMixerCard *b)
 +{
 +        const char *namea;
 +        const char *nameb;
 +
 +        g_return_val_if_fail (a == NULL || GVC_IS_MIXER_CARD (a), 0);
 +        g_return_val_if_fail (b == NULL || GVC_IS_MIXER_CARD (b), 0);
 +
 +        namea = gvc_mixer_card_get_name (a);
 +        nameb = gvc_mixer_card_get_name (b);
 +
 +        return gvc_name_collate (namea, nameb);
 +}
 +
 +/**
 + * gvc_mixer_control_get_cards:
 + * @control:
 + *
 + * Returns: (transfer container) (element-type Gvc.MixerCard):
 + */
 +GSList *
 +gvc_mixer_control_get_cards (GvcMixerControl *control)
 +{
 +        GSList *retval;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        retval = NULL;
 +        g_hash_table_foreach (control->priv->cards,
 +                              listify_hash_values_hfunc,
 +                              &retval);
 +        return g_slist_sort (retval, (GCompareFunc) gvc_card_collate);
 +}
 +
 +static int
 +gvc_stream_collate (GvcMixerStream *a,
 +                    GvcMixerStream *b)
 +{
 +        const char *namea;
 +        const char *nameb;
 +
 +        g_return_val_if_fail (a == NULL || GVC_IS_MIXER_STREAM (a), 0);
 +        g_return_val_if_fail (b == NULL || GVC_IS_MIXER_STREAM (b), 0);
 +
 +        namea = gvc_mixer_stream_get_name (a);
 +        nameb = gvc_mixer_stream_get_name (b);
 +
 +        return gvc_name_collate (namea, nameb);
 +}
 +
 +/**
 + * gvc_mixer_control_get_streams:
 + * @control:
 + *
 + * Returns: (transfer container) (element-type Gvc.MixerStream):
 + */
 +GSList *
 +gvc_mixer_control_get_streams (GvcMixerControl *control)
 +{
 +        GSList *retval;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        retval = NULL;
 +        g_hash_table_foreach (control->priv->all_streams,
 +                              listify_hash_values_hfunc,
 +                              &retval);
 +        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
 +}
 +
 +/**
 + * gvc_mixer_control_get_sinks:
 + * @control:
 + *
 + * Returns: (transfer container) (element-type Gvc.MixerSink):
 + */
 +GSList *
 +gvc_mixer_control_get_sinks (GvcMixerControl *control)
 +{
 +        GSList *retval;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        retval = NULL;
 +        g_hash_table_foreach (control->priv->sinks,
 +                              listify_hash_values_hfunc,
 +                              &retval);
 +        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
 +}
 +
 +/**
 + * gvc_mixer_control_get_sources:
 + * @control:
 + *
 + * Returns: (transfer container) (element-type Gvc.MixerSource):
 + */
 +GSList *
 +gvc_mixer_control_get_sources (GvcMixerControl *control)
 +{
 +        GSList *retval;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        retval = NULL;
 +        g_hash_table_foreach (control->priv->sources,
 +                              listify_hash_values_hfunc,
 +                              &retval);
 +        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
 +}
 +
 +/**
 + * gvc_mixer_control_get_sink_inputs:
 + * @control:
 + *
 + * Returns: (transfer container) (element-type Gvc.MixerSinkInput):
 + */
 +GSList *
 +gvc_mixer_control_get_sink_inputs (GvcMixerControl *control)
 +{
 +        GSList *retval;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        retval = NULL;
 +        g_hash_table_foreach (control->priv->sink_inputs,
 +                              listify_hash_values_hfunc,
 +                              &retval);
 +        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
 +}
 +
 +/**
 + * gvc_mixer_control_get_source_outputs:
 + * @control:
 + *
 + * Returns: (transfer container) (element-type Gvc.MixerSourceOutput):
 + */
 +GSList *
 +gvc_mixer_control_get_source_outputs (GvcMixerControl *control)
 +{
 +        GSList *retval;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 +
 +        retval = NULL;
 +        g_hash_table_foreach (control->priv->source_outputs,
 +                              listify_hash_values_hfunc,
 +                              &retval);
 +        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
 +}
 +
 +static void
 +dec_outstanding (GvcMixerControl *control)
 +{
 +        if (control->priv->n_outstanding <= 0) {
 +                return;
 +        }
 +
 +        if (--control->priv->n_outstanding <= 0) {
 +                control->priv->state = GVC_STATE_READY;
 +                g_signal_emit (G_OBJECT (control), signals[STATE_CHANGED], 0, GVC_STATE_READY);
 +        }
 +}
 +
 +GvcMixerControlState
 +gvc_mixer_control_get_state (GvcMixerControl *control)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), GVC_STATE_CLOSED);
 +
 +        return control->priv->state;
 +}
 +
 +static void
 +on_default_source_port_notify (GObject        *object,
 +                               GParamSpec     *pspec,
 +                               GvcMixerControl *control)
 +{
 +        char             *port;
 +        GvcMixerUIDevice *input;
 +
 +        g_object_get (object, "port", &port, NULL);
 +        input = gvc_mixer_control_lookup_device_from_stream (control,
 +                                                             GVC_MIXER_STREAM (object));
 +
 +        g_debug ("on_default_source_port_notify - moved to port '%s' which SHOULD ?? correspond to output '%s'",
 +                 port,
 +                 gvc_mixer_ui_device_get_description (input));
 +
 +        g_signal_emit (G_OBJECT (control),
 +                       signals[ACTIVE_INPUT_UPDATE],
 +                       0,
 +                       gvc_mixer_ui_device_get_id (input));
 +
 +        g_free (port);
 +}
 +
 +
 +static void
 +_set_default_source (GvcMixerControl *control,
 +                     GvcMixerStream  *stream)
 +{
 +        guint new_id;
 +
 +        if (stream == NULL) {
 +                control->priv->default_source_id = 0;
 +                control->priv->default_source_is_set = FALSE;
 +                g_signal_emit (control,
 +                               signals[DEFAULT_SOURCE_CHANGED],
 +                               0,
 +                               PA_INVALID_INDEX);
 +                return;
 +        }
 +
 +        new_id = gvc_mixer_stream_get_id (stream);
 +
 +        if (control->priv->default_source_id != new_id) {
 +                GvcMixerUIDevice *input;
 +                control->priv->default_source_id = new_id;
 +                control->priv->default_source_is_set = TRUE;
 +                g_signal_emit (control,
 +                               signals[DEFAULT_SOURCE_CHANGED],
 +                               0,
 +                               new_id);
 +
 +                if (control->priv->default_source_is_set) {
 +                        g_signal_handlers_disconnect_by_func (gvc_mixer_control_get_default_source (control),
 +                                                              on_default_source_port_notify,
 +                                                              control);
 +                }
 +
 +                g_signal_connect (stream,
 +                                  "notify::port",
 +                                  G_CALLBACK (on_default_source_port_notify),
 +                                  control);
 +
 +                input = gvc_mixer_control_lookup_device_from_stream (control, stream);
 +
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[ACTIVE_INPUT_UPDATE],
 +                               0,
 +                               gvc_mixer_ui_device_get_id (input));
 +        }
 +}
 +
 +static void
 +on_default_sink_port_notify (GObject        *object,
 +                             GParamSpec     *pspec,
 +                             GvcMixerControl *control)
 +{
 +        char             *port;
 +        GvcMixerUIDevice *output;
 +
 +        g_object_get (object, "port", &port, NULL);
 +
 +        output = gvc_mixer_control_lookup_device_from_stream (control,
 +                                                              GVC_MIXER_STREAM (object));
 +        if (output != NULL) {
 +                g_debug ("on_default_sink_port_notify - moved to port %s - which SHOULD correspond to output %s",
 +                         port,
 +                         gvc_mixer_ui_device_get_description (output));
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[ACTIVE_OUTPUT_UPDATE],
 +                               0,
 +                               gvc_mixer_ui_device_get_id (output));
 +        }
 +        g_free (port);
 +}
 +
 +static void
 +_set_default_sink (GvcMixerControl *control,
 +                   GvcMixerStream  *stream)
 +{
 +        guint new_id;
 +
 +        if (stream == NULL) {
 +                /* Don't tell front-ends about an unset default
 +                 * sink if it's already unset */
 +                if (control->priv->default_sink_is_set == FALSE)
 +                        return;
 +                control->priv->default_sink_id = 0;
 +                control->priv->default_sink_is_set = FALSE;
 +                g_signal_emit (control,
 +                               signals[DEFAULT_SINK_CHANGED],
 +                               0,
 +                               PA_INVALID_INDEX);
 +                return;
 +        }
 +
 +        new_id = gvc_mixer_stream_get_id (stream);
 +
 +        if (control->priv->default_sink_id != new_id) {
 +                GvcMixerUIDevice *output;
 +                if (control->priv->default_sink_is_set) {
 +                        g_signal_handlers_disconnect_by_func (gvc_mixer_control_get_default_sink (control),
 +                                                              on_default_sink_port_notify,
 +                                                              control);
 +                }
 +
 +                control->priv->default_sink_id = new_id;
 +
 +                control->priv->default_sink_is_set = TRUE;
 +                g_signal_emit (control,
 +                               signals[DEFAULT_SINK_CHANGED],
 +                               0,
 +                               new_id);
 +
 +                g_signal_connect (stream,
 +                                  "notify::port",
 +                                  G_CALLBACK (on_default_sink_port_notify),
 +                                  control);
 +
 +                output = gvc_mixer_control_lookup_device_from_stream (control, stream);
 +
 +                g_debug ("active_sink change");
 +
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[ACTIVE_OUTPUT_UPDATE],
 +                               0,
 +                               gvc_mixer_ui_device_get_id (output));
 +        }
 +}
 +
 +static gboolean
 +_stream_has_name (gpointer        key,
 +                  GvcMixerStream *stream,
 +                  const char     *name)
 +{
 +        const char *t_name;
 +
 +        t_name = gvc_mixer_stream_get_name (stream);
 +
 +        if (t_name != NULL
 +            && name != NULL
 +            && strcmp (t_name, name) == 0) {
 +                return TRUE;
 +        }
 +
 +        return FALSE;
 +}
 +
 +static GvcMixerStream *
 +find_stream_for_name (GvcMixerControl *control,
 +                      const char      *name)
 +{
 +        GvcMixerStream *stream;
 +
 +        stream = g_hash_table_find (control->priv->all_streams,
 +                                    (GHRFunc)_stream_has_name,
 +                                    (char *)name);
 +        return stream;
 +}
 +
 +static void
 +update_default_source_from_name (GvcMixerControl *control,
 +                                 const char      *name)
 +{
 +        gboolean changed = FALSE;
 +
 +        if ((control->priv->default_source_name == NULL
 +             && name != NULL)
 +            || (control->priv->default_source_name != NULL
 +                && name == NULL)
 +            || (name != NULL && strcmp (control->priv->default_source_name, name) != 0)) {
 +                changed = TRUE;
 +        }
 +
 +        if (changed) {
 +                GvcMixerStream *stream;
 +
 +                g_free (control->priv->default_source_name);
 +                control->priv->default_source_name = g_strdup (name);
 +
 +                stream = find_stream_for_name (control, name);
 +                _set_default_source (control, stream);
 +        }
 +}
 +
 +static void
 +update_default_sink_from_name (GvcMixerControl *control,
 +                               const char      *name)
 +{
 +        gboolean changed = FALSE;
 +
 +        if ((control->priv->default_sink_name == NULL
 +             && name != NULL)
 +            || (control->priv->default_sink_name != NULL
 +                && name == NULL)
 +            || (name != NULL && strcmp (control->priv->default_sink_name, name) != 0)) {
 +                changed = TRUE;
 +        }
 +
 +        if (changed) {
 +                GvcMixerStream *stream;
 +                g_free (control->priv->default_sink_name);
 +                control->priv->default_sink_name = g_strdup (name);
 +
 +                stream = find_stream_for_name (control, name);
 +                _set_default_sink (control, stream);
 +        }
 +}
 +
 +static void
 +update_server (GvcMixerControl      *control,
 +               const pa_server_info *info)
 +{
 +        if (info->default_source_name != NULL) {
 +                update_default_source_from_name (control, info->default_source_name);
 +        }
 +        if (info->default_sink_name != NULL) {
 +                g_debug ("update server");
 +                update_default_sink_from_name (control, info->default_sink_name);
 +        }
 +}
 +
 +static void
 +remove_stream (GvcMixerControl *control,
 +               GvcMixerStream  *stream)
 +{
 +        guint id;
 +
 +        g_object_ref (stream);
 +
 +        id = gvc_mixer_stream_get_id (stream);
 +
 +        if (id == control->priv->default_sink_id) {
 +                _set_default_sink (control, NULL);
 +        } else if (id == control->priv->default_source_id) {
 +                _set_default_source (control, NULL);
 +        }
 +
 +        g_hash_table_remove (control->priv->all_streams,
 +                             GUINT_TO_POINTER (id));
 +        g_signal_emit (G_OBJECT (control),
 +                       signals[STREAM_REMOVED],
 +                       0,
 +                       gvc_mixer_stream_get_id (stream));
 +        g_object_unref (stream);
 +}
 +
 +static void
 +add_stream (GvcMixerControl *control,
 +            GvcMixerStream  *stream)
 +{
 +        g_hash_table_insert (control->priv->all_streams,
 +                             GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)),
 +                             stream);
 +        g_signal_emit (G_OBJECT (control),
 +                       signals[STREAM_ADDED],
 +                       0,
 +                       gvc_mixer_stream_get_id (stream));
 +}
 +
 +/* This method will match individual stream ports against its corresponding device
 + * It does this by:
 + * - iterates through our devices and finds the one where the card-id on the device is the same as the card-id on the stream
 + *   and the port-name on the device is the same as the streamport-name.
 + * This should always find a match and is used exclusively by sync_devices().
 + */
 +static gboolean
 +match_stream_with_devices (GvcMixerControl    *control,
 +                           GvcMixerStreamPort *stream_port,
 +                           GvcMixerStream     *stream)
 +{
 +        GList                   *devices, *d;
 +        guint                    stream_card_id;
 +        guint                    stream_id;
 +        gboolean                 in_possession = FALSE;
 +
 +        stream_id      =  gvc_mixer_stream_get_id (stream);
 +        stream_card_id =  gvc_mixer_stream_get_card_index (stream);
 +
 +        devices  = g_hash_table_get_values (GVC_IS_MIXER_SOURCE (stream) ? control->priv->ui_inputs : control->priv->ui_outputs);
 +
 +        for (d = devices; d != NULL; d = d->next) {
 +                GvcMixerUIDevice *device;
-                                               "stream-id", (gint)stream_id,
++                guint             device_stream_id;
 +                gchar            *device_port_name;
 +                gchar            *origin;
 +                gchar            *description;
 +                GvcMixerCard     *card;
 +                guint             card_id;
 +
 +                device = d->data;
 +                g_object_get (G_OBJECT (device),
 +                             "stream-id", &device_stream_id,
 +                             "card", &card,
 +                             "origin", &origin,
 +                             "description", &description,
 +                             "port-name", &device_port_name,
 +                              NULL);
 +
 +                if (card == NULL) {
 +                        if (device_stream_id == stream_id) {
 +                                g_debug ("Matched stream %u with card-less device '%s', with stream already setup",
 +                                         stream_id, description);
 +                                in_possession = TRUE;
 +                        }
 +                } else {
 +                        card_id = gvc_mixer_card_get_index (card);
 +
 +                        g_debug ("Attempt to match_stream update_with_existing_outputs - Try description : '%s', origin : '%s', device port name : '%s', card : %p, AGAINST stream port: '%s', sink card id %i",
 +                                 description,
 +                                 origin,
 +                                 device_port_name,
 +                                 card,
 +                                 stream_port->port,
 +                                 stream_card_id);
 +
 +                        if (stream_card_id == card_id &&
 +                            g_strcmp0 (device_port_name, stream_port->port) == 0) {
 +                                g_debug ("Match device with stream: We have a match with description: '%s', origin: '%s', cached already with device id %u, so set stream id to %i",
 +                                         description,
 +                                         origin,
 +                                         gvc_mixer_ui_device_get_id (device),
 +                                         stream_id);
 +
 +                                g_object_set (G_OBJECT (device),
-         gint         stream_port_count = 0;
++                                              "stream-id", stream_id,
 +                                              NULL);
 +                                in_possession = TRUE;
 +                        }
 +                }
 +
 +                g_free (device_port_name);
 +                g_free (origin);
 +                g_free (description);
 +
 +                if (in_possession == TRUE)
 +                        break;
 +        }
 +
 +        g_list_free (devices);
 +        return in_possession;
 +}
 +
 +/*
 + * This method attempts to match a sink or source with its relevant UI device.
 + * GvcMixerStream can represent both a sink or source.
 + * Using static card port introspection implies that we know beforehand what
 + * outputs and inputs are available to the user.
 + * But that does not mean that all of these inputs and outputs are available to be used.
 + * For instance we might be able to see that there is a HDMI port available but if
 + * we are on the default analog stereo output profile there is no valid sink for
 + * that HDMI device. We first need to change profile and when update_sink() is called
 + * only then can we match the new hdmi sink with its corresponding device.
 + *
 + * Firstly it checks to see if the incoming stream has no ports.
 + * - If a stream has no ports but has a valid card ID (bluetooth), it will attempt
 + *   to match the device with the stream using the card id.
 + * - If a stream has no ports and no valid card id, it goes ahead and makes a new
 + *   device (software/network devices are only detectable at the sink/source level)
 + * If the stream has ports it will match each port against the stream using match_stream_with_devices().
 + *
 + * This method should always find a match.
 + */
 +static void
 +sync_devices (GvcMixerControl *control,
 +              GvcMixerStream* stream)
 +{
 +        /* Go through ports to see what outputs can be created. */
 +        const GList *stream_ports;
 +        const GList *n = NULL;
 +        gboolean     is_output = !GVC_IS_MIXER_SOURCE (stream);
-                                       "stream-id", (gint)gvc_mixer_stream_get_id (stream),
 +
 +        stream_ports = gvc_mixer_stream_get_ports (stream);
 +
 +        if (stream_ports == NULL) {
 +                GvcMixerUIDevice *device;
 +                /* Bluetooth, no ports but a valid card */
 +                if (gvc_mixer_stream_get_card_index (stream) != PA_INVALID_INDEX) {
 +                        GList *devices, *d;
 +                        gboolean in_possession = FALSE;
 +
 +                        devices = g_hash_table_get_values (is_output ? control->priv->ui_outputs : control->priv->ui_inputs);
 +
 +                        for (d = devices; d != NULL; d = d->next) {
 +                                GvcMixerCard *card;
 +                                guint card_id;
 +
 +                                device = d->data;
 +
 +                                g_object_get (G_OBJECT (device),
 +                                             "card", &card,
 +                                              NULL);
 +                                card_id = gvc_mixer_card_get_index (card);
 +                                g_debug ("sync devices, device description - '%s', device card id - %i, stream description - %s, stream card id - %i",
 +                                         gvc_mixer_ui_device_get_description (device),
 +                                         card_id,
 +                                         gvc_mixer_stream_get_description (stream),
 +                                         gvc_mixer_stream_get_card_index (stream));
 +                                if (card_id == gvc_mixer_stream_get_card_index (stream)) {
 +                                        in_possession = TRUE;
 +                                        break;
 +                                }
 +                        }
 +                        g_list_free (devices);
 +
 +                        if (!in_possession) {
 +                                g_warning ("Couldn't match the portless stream (with card) - '%s' is it an input ? -> %i, streams card id -> %i",
 +                                           gvc_mixer_stream_get_description (stream),
 +                                           GVC_IS_MIXER_SOURCE (stream),
 +                                           gvc_mixer_stream_get_card_index (stream));
 +                                return;
 +                        }
 +
 +                        g_object_set (G_OBJECT (device),
-                                                "stream-id", (gint)gvc_mixer_stream_get_id (stream),
++                                      "stream-id", gvc_mixer_stream_get_id (stream),
 +                                      "description", gvc_mixer_stream_get_description (stream),
 +                                      "origin", "", /*Leave it empty for these special cases*/
 +                                      "port-name", NULL,
 +                                      "port-available", TRUE,
 +                                      NULL);
 +                } else { /* Network sink/source has no ports and no card. */
 +                        GObject *object;
 +
 +                        object = g_object_new (GVC_TYPE_MIXER_UI_DEVICE,
-                 stream_port_count ++;
++                                               "stream-id", gvc_mixer_stream_get_id (stream),
 +                                               "description", gvc_mixer_stream_get_description (stream),
 +                                               "origin", "", /* Leave it empty for these special cases */
 +                                               "port-name", NULL,
 +                                               "port-available", TRUE,
 +                                                NULL);
 +                        device = GVC_MIXER_UI_DEVICE (object);
 +
 +                        g_hash_table_insert (is_output ? control->priv->ui_outputs : control->priv->ui_inputs,
 +                                             GUINT_TO_POINTER (gvc_mixer_ui_device_get_id (device)),
 +                                             g_object_ref (device));
 +
 +                }
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[is_output ? OUTPUT_ADDED : INPUT_ADDED],
 +                               0,
 +                               gvc_mixer_ui_device_get_id (device));
 +
 +                return;
 +        }
 +
 +        /* Go ahead and make sure to match each port against a previously created device */
 +        for (n = stream_ports; n != NULL; n = n->next) {
 +
 +                GvcMixerStreamPort *stream_port;
 +                stream_port = n->data;
-         set_icon_name_from_proplist (stream, info->proplist, "applications-multimedia");
 +
 +                if (match_stream_with_devices (control, stream_port, stream))
 +                        continue;
 +
 +                g_warning ("Sync_devices: Failed to match stream id: %u, description: '%s', origin: '%s'",
 +                           gvc_mixer_stream_get_id (stream),
 +                           stream_port->human_port,
 +                           gvc_mixer_stream_get_description (stream));
 +        }
 +}
 +
 +static void
 +set_icon_name_from_proplist (GvcMixerStream *stream,
 +                             pa_proplist    *l,
 +                             const char     *default_icon_name)
 +{
 +        const char *t;
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_DEVICE_ICON_NAME))) {
 +                goto finish;
 +        }
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ICON_NAME))) {
 +                goto finish;
 +        }
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_WINDOW_ICON_NAME))) {
 +                goto finish;
 +        }
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_APPLICATION_ICON_NAME))) {
 +                goto finish;
 +        }
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ROLE))) {
 +
 +                if (strcmp (t, "video") == 0 ||
 +                    strcmp (t, "phone") == 0) {
 +                        goto finish;
 +                }
 +
 +                if (strcmp (t, "music") == 0) {
 +                        t = "audio";
 +                        goto finish;
 +                }
 +
 +                if (strcmp (t, "game") == 0) {
 +                        t = "applications-games";
 +                        goto finish;
 +                }
 +
 +                if (strcmp (t, "event") == 0) {
 +                        t = "dialog-information";
 +                        goto finish;
 +                }
 +        }
 +
 +        t = default_icon_name;
 +
 + finish:
 +        gvc_mixer_stream_set_icon_name (stream, t);
 +}
 +
 +static GvcMixerStreamState
 +translate_pa_state (pa_sink_state_t state) {
 +        switch (state) {
 +        case PA_SINK_RUNNING:
 +                return GVC_STREAM_STATE_RUNNING;
 +        case PA_SINK_IDLE:
 +                return GVC_STREAM_STATE_IDLE;
 +        case PA_SINK_SUSPENDED:
 +                return GVC_STREAM_STATE_SUSPENDED;
 +        case PA_SINK_INIT:
 +        case PA_SINK_INVALID_STATE:
 +        case PA_SINK_UNLINKED:
 +        default:
 +                return GVC_STREAM_STATE_INVALID;
 +        }
 +}
 +
 +/*
 + * Called when anything changes with a sink.
 + */
 +static void
 +update_sink (GvcMixerControl    *control,
 +             const pa_sink_info *info)
 +{
 +        GvcMixerStream  *stream;
 +        gboolean        is_new;
 +        pa_volume_t     max_volume;
 +        GvcChannelMap   *map;
 +        char            map_buff[PA_CHANNEL_MAP_SNPRINT_MAX];
 +
 +        pa_channel_map_snprint (map_buff, PA_CHANNEL_MAP_SNPRINT_MAX, &info->channel_map);
 +#if 1
 +        g_debug ("Updating sink: index=%u name='%s' description='%s' map='%s'",
 +                 info->index,
 +                 info->name,
 +                 info->description,
 +                 map_buff);
 +#endif
 +
 +        map = NULL;
 +        is_new = FALSE;
 +        stream = g_hash_table_lookup (control->priv->sinks,
 +                                      GUINT_TO_POINTER (info->index));
 +
 +        if (stream == NULL) {
 +                GList *list = NULL;
 +                guint i;
 +
 +                map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map);
 +                stream = gvc_mixer_sink_new (control->priv->pa_context,
 +                                             info->index,
 +                                             map);
 +
 +                for (i = 0; i < info->n_ports; i++) {
 +                        GvcMixerStreamPort *port;
 +
 +                        port = g_slice_new0 (GvcMixerStreamPort);
 +                        port->port = g_strdup (info->ports[i]->name);
 +                        port->human_port = g_strdup (info->ports[i]->description);
 +                        port->priority = info->ports[i]->priority;
 +                        port->available = info->ports[i]->available != PA_PORT_AVAILABLE_NO;
 +
 +                        list = g_list_prepend (list, port);
 +                }
 +                gvc_mixer_stream_set_ports (stream, list);
 +
 +                g_object_unref (map);
 +                is_new = TRUE;
 +
 +        } else if (gvc_mixer_stream_is_running (stream)) {
 +                /* Ignore events if volume changes are outstanding */
 +                g_debug ("Ignoring event, volume changes are outstanding");
 +                return;
 +        }
 +
 +        max_volume = pa_cvolume_max (&info->volume);
 +        gvc_mixer_stream_set_name (stream, info->name);
 +        gvc_mixer_stream_set_card_index (stream, info->card);
 +        gvc_mixer_stream_set_description (stream, info->description);
 +        set_icon_name_from_proplist (stream, info->proplist, "audio-card");
 +        gvc_mixer_stream_set_form_factor (stream, pa_proplist_gets (info->proplist, PA_PROP_DEVICE_FORM_FACTOR));
 +        gvc_mixer_stream_set_sysfs_path (stream, pa_proplist_gets (info->proplist, "sysfs.path"));
 +        gvc_mixer_stream_set_volume (stream, (guint)max_volume);
 +        gvc_mixer_stream_set_is_muted (stream, info->mute);
 +        gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SINK_DECIBEL_VOLUME));
 +        gvc_mixer_stream_set_base_volume (stream, (guint32) info->base_volume);
 +        gvc_mixer_stream_set_state (stream, translate_pa_state (info->state));
 +
 +        /* Messy I know but to set the port everytime regardless of whether it has changed will cost us a
 +         * port change notify signal which causes the frontend to resync.
 +         * Only update the UI when something has changed. */
 +        if (info->active_port != NULL) {
 +                if (is_new)
 +                        gvc_mixer_stream_set_port (stream, info->active_port->name);
 +                else {
 +                        const GvcMixerStreamPort *active_port;
 +                        active_port = gvc_mixer_stream_get_port (stream);
 +                        if (active_port == NULL ||
 +                            g_strcmp0 (active_port->port, info->active_port->name) != 0) {
 +                                g_debug ("update sink - apparently a port update");
 +                                gvc_mixer_stream_set_port (stream, info->active_port->name);
 +                        }
 +                }
 +        }
 +
 +        if (is_new) {
 +                g_debug ("update sink - is new");
 +
 +                g_hash_table_insert (control->priv->sinks,
 +                                     GUINT_TO_POINTER (info->index),
 +                                     g_object_ref (stream));
 +                add_stream (control, stream);
 +                /* Always sink on a new stream to able to assign the right stream id
 +                 * to the appropriate outputs (multiple potential outputs per stream). */
 +                sync_devices (control, stream);
 +        } else {
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[STREAM_CHANGED],
 +                               0,
 +                               gvc_mixer_stream_get_id (stream));
 +        }
 +
 +        /*
 +         * When we change profile on a device that is not the server default sink,
 +         * it will jump back to the default sink set by the server to prevent the audio setup from being 'outputless'.
 +         * All well and good but then when we get the new stream created for the new profile how do we know
 +         * that this is the intended default or selected device the user wishes to use.
 +         * This is messy but it's the only reliable way that it can be done without ripping the whole thing apart.
 +         */
 +        if (control->priv->profile_swapping_device_id != GVC_MIXER_UI_DEVICE_INVALID) {
 +                GvcMixerUIDevice *dev = NULL;
 +                dev = gvc_mixer_control_lookup_output_id (control, control->priv->profile_swapping_device_id);
 +                if (dev != NULL) {
 +                        /* now check to make sure this new stream is the same stream just matched and set on the device object */
 +                        if (gvc_mixer_ui_device_get_stream_id (dev) == gvc_mixer_stream_get_id (stream)) {
 +                                g_debug ("Looks like we profile swapped on a non server default sink");
 +                                gvc_mixer_control_set_default_sink (control, stream);
 +                                control->priv->profile_swapping_device_id = GVC_MIXER_UI_DEVICE_INVALID;
 +                        }
 +                }
 +        }
 +
 +        if (control->priv->default_sink_name != NULL
 +            && info->name != NULL
 +            && strcmp (control->priv->default_sink_name, info->name) == 0) {
 +                _set_default_sink (control, stream);
 +        }
 +
 +        if (map == NULL)
 +                map = (GvcChannelMap *) gvc_mixer_stream_get_channel_map (stream);
 +
 +        gvc_channel_map_volume_changed (map, &info->volume, FALSE);
 +}
 +
 +static void
 +update_source (GvcMixerControl      *control,
 +               const pa_source_info *info)
 +{
 +        GvcMixerStream *stream;
 +        gboolean        is_new;
 +        pa_volume_t     max_volume;
 +
 +#if 1
 +        g_debug ("Updating source: index=%u name='%s' description='%s'",
 +                 info->index,
 +                 info->name,
 +                 info->description);
 +#endif
 +
 +        /* completely ignore monitors, they're not real sources */
 +        if (info->monitor_of_sink != PA_INVALID_INDEX) {
 +                return;
 +        }
 +
 +        is_new = FALSE;
 +
 +        stream = g_hash_table_lookup (control->priv->sources,
 +                                      GUINT_TO_POINTER (info->index));
 +        if (stream == NULL) {
 +                GList *list = NULL;
 +                guint i;
 +                GvcChannelMap *map;
 +
 +                map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map);
 +                stream = gvc_mixer_source_new (control->priv->pa_context,
 +                                               info->index,
 +                                               map);
 +
 +                for (i = 0; i < info->n_ports; i++) {
 +                        GvcMixerStreamPort *port;
 +
 +                        port = g_slice_new0 (GvcMixerStreamPort);
 +                        port->port = g_strdup (info->ports[i]->name);
 +                        port->human_port = g_strdup (info->ports[i]->description);
 +                        port->priority = info->ports[i]->priority;
 +                        list = g_list_prepend (list, port);
 +                }
 +                gvc_mixer_stream_set_ports (stream, list);
 +
 +                g_object_unref (map);
 +                is_new = TRUE;
 +        } else if (gvc_mixer_stream_is_running (stream)) {
 +                /* Ignore events if volume changes are outstanding */
 +                g_debug ("Ignoring event, volume changes are outstanding");
 +                return;
 +        }
 +
 +        max_volume = pa_cvolume_max (&info->volume);
 +
 +        gvc_mixer_stream_set_name (stream, info->name);
 +        gvc_mixer_stream_set_card_index (stream, info->card);
 +        gvc_mixer_stream_set_description (stream, info->description);
 +        set_icon_name_from_proplist (stream, info->proplist, "audio-input-microphone");
 +        gvc_mixer_stream_set_form_factor (stream, pa_proplist_gets (info->proplist, PA_PROP_DEVICE_FORM_FACTOR));
 +        gvc_mixer_stream_set_volume (stream, (guint)max_volume);
 +        gvc_mixer_stream_set_is_muted (stream, info->mute);
 +        gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SOURCE_DECIBEL_VOLUME));
 +        gvc_mixer_stream_set_base_volume (stream, (guint32) info->base_volume);
 +        g_debug ("update source");
 +
 +        if (info->active_port != NULL) {
 +                if (is_new)
 +                        gvc_mixer_stream_set_port (stream, info->active_port->name);
 +                else {
 +                        const GvcMixerStreamPort *active_port;
 +                        active_port = gvc_mixer_stream_get_port (stream);
 +                        if (active_port == NULL ||
 +                            g_strcmp0 (active_port->port, info->active_port->name) != 0) {
 +                                g_debug ("update source - apparently a port update");
 +                                gvc_mixer_stream_set_port (stream, info->active_port->name);
 +                        }
 +                }
 +        }
 +
 +        if (is_new) {
 +                g_hash_table_insert (control->priv->sources,
 +                                     GUINT_TO_POINTER (info->index),
 +                                     g_object_ref (stream));
 +                add_stream (control, stream);
 +                sync_devices (control, stream);
 +        } else {
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[STREAM_CHANGED],
 +                               0,
 +                               gvc_mixer_stream_get_id (stream));
 +        }
 +
 +        if (control->priv->profile_swapping_device_id != GVC_MIXER_UI_DEVICE_INVALID) {
 +                GvcMixerUIDevice *dev = NULL;
 +
 +                dev = gvc_mixer_control_lookup_input_id (control, control->priv->profile_swapping_device_id);
 +
 +                if (dev != NULL) {
 +                        /* now check to make sure this new stream is the same stream just matched and set on the device object */
 +                        if (gvc_mixer_ui_device_get_stream_id (dev) == gvc_mixer_stream_get_id (stream)) {
 +                                g_debug ("Looks like we profile swapped on a non server default source");
 +                                gvc_mixer_control_set_default_source (control, stream);
 +                                control->priv->profile_swapping_device_id = GVC_MIXER_UI_DEVICE_INVALID;
 +                        }
 +                }
 +        }
 +        if (control->priv->default_source_name != NULL
 +            && info->name != NULL
 +            && strcmp (control->priv->default_source_name, info->name) == 0) {
 +                _set_default_source (control, stream);
 +        }
 +}
 +
 +static void
 +set_is_event_stream_from_proplist (GvcMixerStream *stream,
 +                                   pa_proplist    *l)
 +{
 +        const char *t;
 +        gboolean is_event_stream;
 +
 +        is_event_stream = FALSE;
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_MEDIA_ROLE))) {
 +                if (g_str_equal (t, "event"))
 +                        is_event_stream = TRUE;
 +        }
 +
 +        gvc_mixer_stream_set_is_event_stream (stream, is_event_stream);
 +}
 +
 +static void
 +set_application_id_from_proplist (GvcMixerStream *stream,
 +                                  pa_proplist    *l)
 +{
 +        const char *t;
 +
 +        if ((t = pa_proplist_gets (l, PA_PROP_APPLICATION_ID))) {
 +                gvc_mixer_stream_set_application_id (stream, t);
 +        }
 +}
 +
 +static void
 +update_sink_input (GvcMixerControl          *control,
 +                   const pa_sink_input_info *info)
 +{
 +        GvcMixerStream *stream;
 +        gboolean        is_new;
 +        pa_volume_t     max_volume;
 +        const char     *name;
 +
 +#if 0
 +        g_debug ("Updating sink input: index=%u name='%s' client=%u sink=%u",
 +                 info->index,
 +                 info->name,
 +                 info->client,
 +                 info->sink);
 +#endif
 +
 +        is_new = FALSE;
 +
 +        stream = g_hash_table_lookup (control->priv->sink_inputs,
 +                                      GUINT_TO_POINTER (info->index));
 +        if (stream == NULL) {
 +                GvcChannelMap *map;
 +                map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map);
 +                stream = gvc_mixer_sink_input_new (control->priv->pa_context,
 +                                                   info->index,
 +                                                   map);
 +                g_object_unref (map);
 +                is_new = TRUE;
 +        } else if (gvc_mixer_stream_is_running (stream)) {
 +                /* Ignore events if volume changes are outstanding */
 +                g_debug ("Ignoring event, volume changes are outstanding");
 +                return;
 +        }
 +
 +        max_volume = pa_cvolume_max (&info->volume);
 +
 +        name = (const char *)g_hash_table_lookup (control->priv->clients,
 +                                                  GUINT_TO_POINTER (info->client));
 +        gvc_mixer_stream_set_name (stream, name);
 +        gvc_mixer_stream_set_description (stream, info->name);
 +
 +        set_application_id_from_proplist (stream, info->proplist);
 +        set_is_event_stream_from_proplist (stream, info->proplist);
-         gvc_mixer_stream_set_icon_name (stream, "emblem-system-symbolic");
++        set_icon_name_from_proplist (stream, info->proplist, "application-x-executable");
 +        gvc_mixer_stream_set_volume (stream, (guint)max_volume);
 +        gvc_mixer_stream_set_is_muted (stream, info->mute);
 +        gvc_mixer_stream_set_is_virtual (stream, info->client == PA_INVALID_INDEX);
 +
 +        if (is_new) {
 +                g_hash_table_insert (control->priv->sink_inputs,
 +                                     GUINT_TO_POINTER (info->index),
 +                                     g_object_ref (stream));
 +                add_stream (control, stream);
 +        } else {
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[STREAM_CHANGED],
 +                               0,
 +                               gvc_mixer_stream_get_id (stream));
 +        }
 +}
 +
 +static void
 +update_source_output (GvcMixerControl             *control,
 +                      const pa_source_output_info *info)
 +{
 +        GvcMixerStream *stream;
 +        gboolean        is_new;
 +        pa_volume_t     max_volume;
 +        const char     *name;
 +
 +#if 1
 +        g_debug ("Updating source output: index=%u name='%s' client=%u source=%u",
 +                 info->index,
 +                 info->name,
 +                 info->client,
 +                 info->source);
 +#endif
 +
 +        is_new = FALSE;
 +        stream = g_hash_table_lookup (control->priv->source_outputs,
 +                                      GUINT_TO_POINTER (info->index));
 +        if (stream == NULL) {
 +                GvcChannelMap *map;
 +                map = gvc_channel_map_new_from_pa_channel_map (&info->channel_map);
 +                stream = gvc_mixer_source_output_new (control->priv->pa_context,
 +                                                      info->index,
 +                                                      map);
 +                g_object_unref (map);
 +                is_new = TRUE;
 +        }
 +
 +        name = (const char *)g_hash_table_lookup (control->priv->clients,
 +                                                  GUINT_TO_POINTER (info->client));
 +
 +        max_volume = pa_cvolume_max (&info->volume);
 +
 +        gvc_mixer_stream_set_name (stream, name);
 +        gvc_mixer_stream_set_description (stream, info->name);
 +        set_application_id_from_proplist (stream, info->proplist);
 +        set_is_event_stream_from_proplist (stream, info->proplist);
 +        gvc_mixer_stream_set_volume (stream, (guint)max_volume);
 +        gvc_mixer_stream_set_is_muted (stream, info->mute);
 +        set_icon_name_from_proplist (stream, info->proplist, "audio-input-microphone");
 +
 +        if (is_new) {
 +                g_hash_table_insert (control->priv->source_outputs,
 +                                     GUINT_TO_POINTER (info->index),
 +                                     g_object_ref (stream));
 +                add_stream (control, stream);
 +        } else {
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[STREAM_CHANGED],
 +                               0,
 +                               gvc_mixer_stream_get_id (stream));
 +        }
 +}
 +
 +static void
 +update_client (GvcMixerControl      *control,
 +               const pa_client_info *info)
 +{
 +#if 1
 +        g_debug ("Updating client: index=%u name='%s'",
 +                 info->index,
 +                 info->name);
 +#endif
 +        g_hash_table_insert (control->priv->clients,
 +                             GUINT_TO_POINTER (info->index),
 +                             g_strdup (info->name));
 +}
 +
 +static char *
 +card_num_streams_to_status (guint sinks,
 +                            guint sources)
 +{
 +        char *sinks_str;
 +        char *sources_str;
 +        char *ret;
 +
 +        if (sinks == 0 && sources == 0) {
 +                /* translators:
 +                 * The device has been disabled */
 +                return g_strdup (_("Disabled"));
 +        }
 +        if (sinks == 0) {
 +                sinks_str = NULL;
 +        } else {
 +                /* translators:
 +                 * The number of sound outputs on a particular device */
 +                sinks_str = g_strdup_printf (ngettext ("%u Output",
 +                                                       "%u Outputs",
 +                                                       sinks),
 +                                             sinks);
 +        }
 +        if (sources == 0) {
 +                sources_str = NULL;
 +        } else {
 +                /* translators:
 +                 * The number of sound inputs on a particular device */
 +                sources_str = g_strdup_printf (ngettext ("%u Input",
 +                                                         "%u Inputs",
 +                                                         sources),
 +                                               sources);
 +        }
 +        if (sources_str == NULL)
 +                return sinks_str;
 +        if (sinks_str == NULL)
 +                return sources_str;
 +        ret = g_strdup_printf ("%s / %s", sinks_str, sources_str);
 +        g_free (sinks_str);
 +        g_free (sources_str);
 +        return ret;
 +}
 +
 +/*
 + * A utility method to gather which card profiles are relevant to the port .
 + */
 +static GList *
 +determine_profiles_for_port (pa_card_port_info *port,
 +                             GList* card_profiles)
 +{
 +        guint i;
 +        GList *supported_profiles = NULL;
 +        GList *p;
 +        for (i = 0; i < port->n_profiles; i++) {
 +                for (p = card_profiles; p != NULL; p = p->next) {
 +                        GvcMixerCardProfile *prof;
 +                        prof = p->data;
 +                        if (g_strcmp0 (port->profiles[i]->name, prof->profile) == 0)
 +                                supported_profiles = g_list_append (supported_profiles, prof);
 +                }
 +        }
 +        g_debug ("%i profiles supported on port %s",
 +                 g_list_length (supported_profiles),
 +                 port->description);
 +        return g_list_sort (supported_profiles, (GCompareFunc) gvc_mixer_card_profile_compare);
 +}
 +
 +static gboolean
 +is_card_port_an_output (GvcMixerCardPort* port)
 +{
 +        return port->direction == PA_DIRECTION_OUTPUT ? TRUE : FALSE;
 +}
 +
 +/*
 + * This method will create a ui device for the given port.
 + */
 +static void
 +create_ui_device_from_port (GvcMixerControl* control,
 +                            GvcMixerCardPort* port,
 +                            GvcMixerCard* card)
 +{
 +        GvcMixerUIDeviceDirection  direction;
 +        GObject                   *object;
 +        GvcMixerUIDevice          *uidevice;
 +        gboolean                   available = port->available != PA_PORT_AVAILABLE_NO;
 +
 +        direction = (is_card_port_an_output (port) == TRUE) ? UIDeviceOutput : UIDeviceInput;
 +
 +        object = g_object_new (GVC_TYPE_MIXER_UI_DEVICE,
 +                               "type", (guint)direction,
 +                               "card", card,
 +                               "port-name", port->port,
 +                               "description", port->human_port,
 +                               "origin", gvc_mixer_card_get_name (card),
 +                               "port-available", available,
 +                               "icon-name", port->icon_name,
 +                               NULL);
 +
 +        uidevice = GVC_MIXER_UI_DEVICE (object);
 +        gvc_mixer_ui_device_set_profiles (uidevice, port->profiles);
 +
 +        g_hash_table_insert (is_card_port_an_output (port) ? control->priv->ui_outputs : control->priv->ui_inputs,
 +                             GUINT_TO_POINTER (gvc_mixer_ui_device_get_id (uidevice)),
 +                             uidevice);
 +
 +
 +        if (available) {
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[is_card_port_an_output (port) ? OUTPUT_ADDED : INPUT_ADDED],
 +                               0,
 +                               gvc_mixer_ui_device_get_id (uidevice));
 +        }
 +
 +        g_debug ("create_ui_device_from_port, direction %u, description '%s', origin '%s', port available %i", 
 +                 direction,
 +                 port->human_port,
 +                 gvc_mixer_card_get_name (card),
 +                 available);
 +}
 +
 +/*
 + * This method will match up GvcMixerCardPorts with existing devices.
 + * A match is achieved if the device's card-id and the port's card-id are the same
 + * && the device's port-name and the card-port's port member are the same.
 + * A signal is then sent adding or removing that device from the UI depending on the availability of the port.
 + */
 +static void
 +match_card_port_with_existing_device (GvcMixerControl   *control,
 +                                      GvcMixerCardPort  *card_port,
 +                                      GvcMixerCard      *card,
 +                                      gboolean           available)
 +{
 +        GList                   *d;
 +        GList                   *devices;
 +        GvcMixerUIDevice        *device;
 +        gboolean                 is_output = is_card_port_an_output (card_port);
 +
 +        devices  = g_hash_table_get_values (is_output ? control->priv->ui_outputs : control->priv->ui_inputs);
 +
 +        for (d = devices; d != NULL; d = d->next) {
 +                GvcMixerCard *device_card;
 +                gchar        *device_port_name;
 +
 +                device = d->data;
 +                g_object_get (G_OBJECT (device),
 +                             "card", &device_card,
 +                             "port-name", &device_port_name,
 +                              NULL);
 +
 +                if (g_strcmp0 (card_port->port, device_port_name) == 0 &&
 +                        device_card == card) {
 +                        g_debug ("Found the relevant device %s, update its port availability flag to %i, is_output %i",
 +                                 device_port_name,
 +                                 available,
 +                                 is_output);
 +                        g_object_set (G_OBJECT (device),
 +                                      "port-available", available, NULL);
 +                        g_signal_emit (G_OBJECT (control),
 +                                       is_output ? signals[available ? OUTPUT_ADDED : OUTPUT_REMOVED] : signals[available ? INPUT_ADDED : INPUT_REMOVED],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (device));
 +               }
 +               g_free (device_port_name);
 +        }
 +
 +        g_list_free (devices);
 +}
 +
 +static void
 +create_ui_device_from_card (GvcMixerControl *control,
 +                            GvcMixerCard    *card)
 +{
 +        GObject          *object;
 +        GvcMixerUIDevice *in;
 +        GvcMixerUIDevice *out;
 +        const GList      *profiles;
 +
 +        /* For now just create two devices and presume this device is multi directional
 +         * Ensure to remove both on card removal (available to false by default) */
 +        profiles = gvc_mixer_card_get_profiles (card);
 +
 +        g_debug ("Portless card just registered - %i", gvc_mixer_card_get_index (card));
 +
 +        object = g_object_new (GVC_TYPE_MIXER_UI_DEVICE,
 +                               "type", UIDeviceInput,
 +                               "description", gvc_mixer_card_get_name (card),
 +                               "origin", "", /* Leave it empty for these special cases */
 +                               "port-name", NULL,
 +                               "port-available", FALSE,
 +                               "card", card,
 +                               NULL);
 +        in = GVC_MIXER_UI_DEVICE (object);
 +        gvc_mixer_ui_device_set_profiles (in, profiles);
 +
 +        g_hash_table_insert (control->priv->ui_inputs,
 +                             GUINT_TO_POINTER (gvc_mixer_ui_device_get_id (in)),
 +                             g_object_ref (in));
 +        object = g_object_new (GVC_TYPE_MIXER_UI_DEVICE,
 +                               "type", UIDeviceOutput,
 +                               "description", gvc_mixer_card_get_name (card),
 +                               "origin", "", /* Leave it empty for these special cases */
 +                               "port-name", NULL,
 +                               "port-available", FALSE,
 +                               "card", card,
 +                               NULL);
 +        out = GVC_MIXER_UI_DEVICE (object);
 +        gvc_mixer_ui_device_set_profiles (out, profiles);
 +
 +        g_hash_table_insert (control->priv->ui_outputs,
 +                             GUINT_TO_POINTER (gvc_mixer_ui_device_get_id (out)),
 +                             g_object_ref (out));
 +}
 +
 +#ifdef HAVE_ALSA
 +typedef struct {
 +        char *port_name_to_set;
 +        guint32 headset_card;
 +} PortStatusData;
 +
 +static void
 +port_status_data_free (PortStatusData *data)
 +{
 +        if (data == NULL)
 +                return;
 +        g_free (data->port_name_to_set);
 +        g_free (data);
 +}
 +
 +/*
 + We need to re-enumerate sources and sinks every time the user makes a choice,
 + because they can change due to use interaction in other software (or policy
 + changes inside PulseAudio). Enumeration means PulseAudio will do a series of
 + callbacks, one for every source/sink.
 + Set the port when we find the correct source/sink.
 + */
 +
 +static void
 +sink_info_cb (pa_context         *c,
 +              const pa_sink_info *i,
 +              int                 eol,
 +              void               *userdata)
 +{
 +        PortStatusData *data = userdata;
 +        pa_operation *o;
 +        guint j;
 +        const char *s;
 +
 +        if (eol != 0) {
 +                port_status_data_free (data);
 +                return;
 +        }
 +
 +        if (i->card != data->headset_card)
 +                return;
 +
 +        s = data->port_name_to_set;
 +
 +        if (i->active_port &&
 +            strcmp (i->active_port->name, s) == 0)
 +                return;
 +
 +        for (j = 0; j < i->n_ports; j++)
 +                if (strcmp (i->ports[j]->name, s) == 0)
 +                        break;
 +
 +        if (j >= i->n_ports)
 +                return;
 +
 +        o = pa_context_set_sink_port_by_index (c, i->index, s, NULL, NULL);
 +        g_clear_pointer (&o, pa_operation_unref);
 +}
 +
 +static void
 +source_info_cb (pa_context           *c,
 +                const pa_source_info *i,
 +                int                   eol,
 +                void                 *userdata)
 +{
 +        PortStatusData *data = userdata;
 +        pa_operation *o;
 +        guint j;
 +        const char *s;
 +
 +        if (eol != 0) {
 +                port_status_data_free (data);
 +                return;
 +        }
 +
 +        if (i->card != data->headset_card)
 +                return;
 +
 +        s = data->port_name_to_set;
 +
 +        for (j = 0; j < i->n_ports; j++) {
 +                if (g_str_equal (i->ports[j]->name, s)) {
 +                        o = pa_context_set_default_source (c,
 +                                                           i->name,
 +                                                           NULL,
 +                                                           NULL);
 +                        if (o == NULL) {
 +                                g_warning ("pa_context_set_default_source() failed");
 +                                return;
 +                        }
 +                }
 +      }
 +
 +        if (i->active_port && strcmp (i->active_port->name, s) == 0)
 +                return;
 +
 +        for (j = 0; j < i->n_ports; j++)
 +                if (strcmp (i->ports[j]->name, s) == 0)
 +                        break;
 +
 +        if (j >= i->n_ports)
 +                return;
 +
 +        o = pa_context_set_source_port_by_index(c, i->index, s, NULL, NULL);
 +        g_clear_pointer (&o, pa_operation_unref);
 +}
 +
 +static void
 +gvc_mixer_control_set_port_status_for_headset (GvcMixerControl *control,
 +                                               guint            id,
 +                                               const char      *port_name,
 +                                               gboolean         is_output)
 +{
 +        pa_operation *o;
 +        PortStatusData *data;
 +
 +        if (port_name == NULL)
 +                return;
 +
 +        data = g_new0 (PortStatusData, 1);
 +        data->port_name_to_set = g_strdup (port_name);
 +        data->headset_card = id;
 +
 +        if (is_output)
 +                o = pa_context_get_sink_info_list (control->priv->pa_context, sink_info_cb, data);
 +        else
 +                o = pa_context_get_source_info_list (control->priv->pa_context, source_info_cb, data);
 +
 +        g_clear_pointer (&o, pa_operation_unref);
 +}
 +#endif /* HAVE_ALSA */
 +
 +static void
 +free_priv_port_names (GvcMixerControl    *control)
 +{
 +#ifdef HAVE_ALSA
 +        g_clear_pointer (&control->priv->headphones_name, g_free);
 +        g_clear_pointer (&control->priv->headsetmic_name, g_free);
 +        g_clear_pointer (&control->priv->headphonemic_name, g_free);
 +        g_clear_pointer (&control->priv->internalspk_name, g_free);
 +        g_clear_pointer (&control->priv->internalmic_name, g_free);
 +#endif
 +}
 +
 +void
 +gvc_mixer_control_set_headset_port (GvcMixerControl      *control,
 +                                    guint                 id,
 +                                    GvcHeadsetPortChoice  choice)
 +{
 +        g_return_if_fail (GVC_IS_MIXER_CONTROL (control));
 +
 +#ifdef HAVE_ALSA
 +        switch (choice) {
 +        case GVC_HEADSET_PORT_CHOICE_HEADPHONES:
 +                gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headphones_name, TRUE);
 +                gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->internalmic_name, FALSE);
 +                break;
 +        case GVC_HEADSET_PORT_CHOICE_HEADSET:
 +                gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headphones_name, TRUE);
 +                gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headsetmic_name, FALSE);
 +                break;
 +        case GVC_HEADSET_PORT_CHOICE_MIC:
 +                gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->internalspk_name, TRUE);
 +                gvc_mixer_control_set_port_status_for_headset (control, id, control->priv->headphonemic_name, FALSE);
 +                break;
 +        case GVC_HEADSET_PORT_CHOICE_NONE:
 +        default:
 +                g_assert_not_reached ();
 +        }
 +#else
 +        g_warning ("BUG: libgnome-volume-control compiled without ALSA support");
 +#endif /* HAVE_ALSA */
 +}
 +
 +#ifdef HAVE_ALSA
 +typedef struct {
 +        const pa_card_port_info *headphones;
 +        const pa_card_port_info *headsetmic;
 +        const pa_card_port_info *headphonemic;
 +        const pa_card_port_info *internalmic;
 +        const pa_card_port_info *internalspk;
 +} headset_ports;
 +
 +/*
 +   In PulseAudio without ucm, ports will show up with the following names:
 +   Headphones - analog-output-headphones
 +   Headset mic - analog-input-headset-mic (was: analog-input-microphone-headset)
 +   Jack in mic-in mode - analog-input-headphone-mic (was: analog-input-microphone)
 +
 +   However, since regular mics also show up as analog-input-microphone,
 +   we need to check for certain controls on alsa mixer level too, to know
 +   if we deal with a separate mic jack, or a multi-function jack with a
 +   mic-in mode (also called "headphone mic").
 +   We check for the following names:
 +
 +   Headphone Mic Jack - indicates headphone and mic-in mode share the same jack,
 +     i e, not two separate jacks. Hardware cannot distinguish between a
 +     headphone and a mic.
 +   Headset Mic Phantom Jack - indicates headset jack where hardware can not
 +     distinguish between headphones and headsets
 +   Headset Mic Jack - indicates headset jack where hardware can distinguish
 +     between headphones and headsets. There is no use popping up a dialog in
 +     this case, unless we already need to do this for the mic-in mode.
 +
 +   From the PA_PROCOTOL_VERSION=34, The device_port structure adds 2 members
 +   availability_group and type, with the help of these 2 members, we could
 +   consolidate the port checking and port setting for non-ucm and with-ucm
 +   cases.
 +*/
 +
 +#define HEADSET_PORT_SET(dst, src) \
 +        do { \
 +                if (!(dst) || (dst)->priority < (src)->priority) \
 +                        dst = src; \
 +        } while (0)
 +
 +#define GET_PORT_NAME(x) (x ? g_strdup (x->name) : NULL)
 +
 +static headset_ports *
 +get_headset_ports (GvcMixerControl    *control,
 +                   const pa_card_info *c)
 +{
 +        headset_ports *h;
 +        guint i;
 +
 +        h = g_new0 (headset_ports, 1);
 +
 +        for (i = 0; i < c->n_ports; i++) {
 +                pa_card_port_info *p = c->ports[i];
 +                if (control->priv->server_protocol_version < 34) {
 +                        if (g_str_equal (p->name, "analog-output-headphones"))
 +                                h->headphones = p;
 +                        else if (g_str_equal (p->name, "analog-input-headset-mic"))
 +                                h->headsetmic = p;
 +                        else if (g_str_equal (p->name, "analog-input-headphone-mic"))
 +                                h->headphonemic = p;
 +                        else if (g_str_equal (p->name, "analog-input-internal-mic"))
 +                                h->internalmic = p;
 +                        else if (g_str_equal (p->name, "analog-output-speaker"))
 +                                h->internalspk = p;
 +                } else {
 +#if (PA_PROTOCOL_VERSION >= 34)
 +                        /* in the first loop, set only headphones */
 +                        /* the microphone ports are assigned in the second loop */
 +                        if (p->type == PA_DEVICE_PORT_TYPE_HEADPHONES) {
 +                                if (p->availability_group)
 +                                        HEADSET_PORT_SET (h->headphones, p);
 +                        } else if (p->type == PA_DEVICE_PORT_TYPE_SPEAKER) {
 +                                HEADSET_PORT_SET (h->internalspk, p);
 +                        } else if (p->type == PA_DEVICE_PORT_TYPE_MIC) {
 +                                if (!p->availability_group)
 +                                        HEADSET_PORT_SET (h->internalmic, p);
 +                        }
 +#else
 +                        g_warning_once ("libgnome-volume-control running against PulseAudio %u, "
 +                                        "but compiled against older %d, report a bug to your distribution",
 +                                        control->priv->server_protocol_version,
 +                                        PA_PROTOCOL_VERSION);
 +#endif
 +                }
 +        }
 +
 +#if (PA_PROTOCOL_VERSION >= 34)
 +        if (h->headphones && (control->priv->server_protocol_version >= 34)) {
 +                for (i = 0; i < c->n_ports; i++) {
 +                        pa_card_port_info *p = c->ports[i];
 +                        if (g_strcmp0(h->headphones->availability_group, p->availability_group))
 +                                continue;
 +                        if (p->direction != PA_DIRECTION_INPUT)
 +                                continue;
 +                        if (p->type == PA_DEVICE_PORT_TYPE_HEADSET)
 +                                HEADSET_PORT_SET (h->headsetmic, p);
 +                        else if (p->type == PA_DEVICE_PORT_TYPE_MIC)
 +                                HEADSET_PORT_SET (h->headphonemic, p);
 +                }
 +        }
 +#endif
 +
 +        return h;
 +}
 +
 +static gboolean
 +verify_alsa_card (int       cardindex,
 +                  gboolean *headsetmic,
 +                  gboolean *headphonemic)
 +{
 +        char *ctlstr;
 +        snd_hctl_t *hctl;
 +        snd_ctl_elem_id_t *id;
 +        int err;
 +
 +        *headsetmic = FALSE;
 +        *headphonemic = FALSE;
 +
 +        ctlstr = g_strdup_printf ("hw:%i", cardindex);
 +        if ((err = snd_hctl_open (&hctl, ctlstr, 0)) < 0) {
 +                g_warning ("snd_hctl_open failed: %s", snd_strerror(err));
 +                g_free (ctlstr);
 +                return FALSE;
 +        }
 +        g_free (ctlstr);
 +
 +        if ((err = snd_hctl_load (hctl)) < 0) {
 +                g_warning ("snd_hctl_load failed: %s", snd_strerror(err));
 +                snd_hctl_close (hctl);
 +                return FALSE;
 +        }
 +
 +        snd_ctl_elem_id_alloca (&id);
 +
 +        snd_ctl_elem_id_clear (id);
 +        snd_ctl_elem_id_set_interface (id, SND_CTL_ELEM_IFACE_CARD);
 +        snd_ctl_elem_id_set_name (id, "Headphone Mic Jack");
 +        if (snd_hctl_find_elem (hctl, id))
 +                *headphonemic = TRUE;
 +
 +        snd_ctl_elem_id_clear (id);
 +        snd_ctl_elem_id_set_interface (id, SND_CTL_ELEM_IFACE_CARD);
 +        snd_ctl_elem_id_set_name (id, "Headset Mic Phantom Jack");
 +        if (snd_hctl_find_elem (hctl, id))
 +                *headsetmic = TRUE;
 +
 +        if (*headphonemic) {
 +                snd_ctl_elem_id_clear (id);
 +                snd_ctl_elem_id_set_interface (id, SND_CTL_ELEM_IFACE_CARD);
 +                snd_ctl_elem_id_set_name (id, "Headset Mic Jack");
 +                if (snd_hctl_find_elem (hctl, id))
 +                        *headsetmic = TRUE;
 +        }
 +
 +        snd_hctl_close (hctl);
 +        return *headsetmic || *headphonemic;
 +}
 +
 +static void
 +check_audio_device_selection_needed (GvcMixerControl    *control,
 +                                     const pa_card_info *info)
 +{
 +        headset_ports *h;
 +        gboolean start_dialog, stop_dialog;
 +
 +        start_dialog = FALSE;
 +        stop_dialog = FALSE;
 +        h = get_headset_ports (control, info);
 +
 +        if (!h->headphones ||
 +            (!h->headsetmic && !h->headphonemic)) {
 +                /* Not a headset jack */
 +                goto out;
 +        }
 +
 +        if (control->priv->headset_card != (int) info->index) {
 +                int cardindex;
 +                gboolean hsmic = TRUE;
 +                gboolean hpmic = TRUE;
 +                const char *s;
 +
 +                s = pa_proplist_gets (info->proplist, "alsa.card");
 +                if (!s)
 +                        goto out;
 +
 +                cardindex = strtol (s, NULL, 10);
 +                if (cardindex == 0 && strcmp(s, "0") != 0)
 +                        goto out;
 +
 +                if (control->priv->server_protocol_version < 34) {
 +                        if (!verify_alsa_card(cardindex, &hsmic, &hpmic))
 +                                goto out;
 +                }
 +
 +                control->priv->headset_card = info->index;
 +                control->priv->has_headsetmic = hsmic && h->headsetmic;
 +                control->priv->has_headphonemic = hpmic && h->headphonemic;
 +        } else {
 +                start_dialog = (h->headphones->available != PA_PORT_AVAILABLE_NO) && !control->priv->headset_plugged_in;
 +                stop_dialog = (h->headphones->available == PA_PORT_AVAILABLE_NO) && control->priv->headset_plugged_in;
 +        }
 +
 +        control->priv->headset_plugged_in = h->headphones->available != PA_PORT_AVAILABLE_NO;
 +        free_priv_port_names (control);
 +        control->priv->headphones_name = GET_PORT_NAME(h->headphones);
 +        control->priv->headsetmic_name = GET_PORT_NAME(h->headsetmic);
 +        control->priv->headphonemic_name = GET_PORT_NAME(h->headphonemic);
 +        control->priv->internalspk_name = GET_PORT_NAME(h->internalspk);
 +        control->priv->internalmic_name = GET_PORT_NAME(h->internalmic);
 +
 +        if (!start_dialog &&
 +            !stop_dialog)
 +                goto out;
 +
 +        if (stop_dialog) {
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[AUDIO_DEVICE_SELECTION_NEEDED],
 +                               0,
 +                               info->index,
 +                               FALSE,
 +                               GVC_HEADSET_PORT_CHOICE_NONE);
 +        } else {
 +                GvcHeadsetPortChoice choices;
 +
 +                choices = GVC_HEADSET_PORT_CHOICE_HEADPHONES;
 +                if (control->priv->has_headsetmic)
 +                        choices |= GVC_HEADSET_PORT_CHOICE_HEADSET;
 +                if (control->priv->has_headphonemic)
 +                        choices |= GVC_HEADSET_PORT_CHOICE_MIC;
 +
 +                g_signal_emit (G_OBJECT (control),
 +                               signals[AUDIO_DEVICE_SELECTION_NEEDED],
 +                               0,
 +                               info->index,
 +                               TRUE,
 +                               choices);
 +        }
 +
 +out:
 +        g_free (h);
 +}
 +#endif /* HAVE_ALSA */
 +
 +/*
 + * At this point we can determine all devices available to us (besides network 'ports')
 + * This is done by the following:
 + *
 + * - gvc_mixer_card and gvc_mixer_card_ports are created and relevant setters are called.
 + * - First it checks to see if it's a portless card. Bluetooth devices are portless AFAIHS.
 + *        If so it creates two devices, an input and an output.
 + * - If it's a 'normal' card with ports it will create a new ui-device or
 + *   synchronise port availability with the existing device cached for that port on this card. */
 +
 +static void
 +update_card (GvcMixerControl      *control,
 +             const pa_card_info   *info)
 +{
 +        const GList  *card_ports = NULL;
 +        const GList  *m = NULL;
 +        GvcMixerCard *card;
 +        gboolean      is_new = FALSE;
 +#if 1
 +        guint i;
 +        const char *key;
 +        void *state;
 +
 +        g_debug ("Updating card %s (index: %u driver: %s):",
 +                 info->name, info->index, info->driver);
 +
 +        for (i = 0; i < info->n_profiles; i++) {
 +                struct pa_card_profile_info pi = info->profiles[i];
 +                gboolean is_default;
 +
 +                is_default = (g_strcmp0 (pi.name, info->active_profile->name) == 0);
 +                g_debug ("\tProfile '%s': %d sources %d sinks%s",
 +                         pi.name, pi.n_sources, pi.n_sinks,
 +                         is_default ? " (Current)" : "");
 +        }
 +        state = NULL;
 +        key = pa_proplist_iterate (info->proplist, &state);
 +        while (key != NULL) {
 +                g_debug ("\tProperty: '%s' = '%s'",
 +                        key, pa_proplist_gets (info->proplist, key));
 +                key = pa_proplist_iterate (info->proplist, &state);
 +        }
 +#endif
 +        card = g_hash_table_lookup (control->priv->cards,
 +                                    GUINT_TO_POINTER (info->index));
 +        if (card == NULL) {
 +                GList *profile_list = NULL;
 +                GList *port_list = NULL;
 +
 +                for (i = 0; i < info->n_profiles; i++) {
 +                        GvcMixerCardProfile *profile;
 +                        struct pa_card_profile_info pi = info->profiles[i];
 +
 +                        profile = g_new0 (GvcMixerCardProfile, 1);
 +                        profile->profile = g_strdup (pi.name);
 +                        profile->human_profile = g_strdup (pi.description);
 +                        profile->status = card_num_streams_to_status (pi.n_sinks, pi.n_sources);
 +                        profile->n_sinks = pi.n_sinks;
 +                        profile->n_sources = pi.n_sources;
 +                        profile->priority = pi.priority;
 +                        profile_list = g_list_prepend (profile_list, profile);
 +                }
 +                card = gvc_mixer_card_new (control->priv->pa_context,
 +                                           info->index);
 +
 +                for (i = 0; i < info->n_ports; i++) {
 +                        GvcMixerCardPort *port;
 +                        port = g_new0 (GvcMixerCardPort, 1);
 +                        port->port = g_strdup (info->ports[i]->name);
 +                        port->human_port = g_strdup (info->ports[i]->description);
 +                        port->priority = info->ports[i]->priority;
 +                        port->available = info->ports[i]->available;
 +                        port->direction = info->ports[i]->direction;
 +                        port->icon_name = g_strdup (pa_proplist_gets (info->ports[i]->proplist, "device.icon_name"));
 +                        port->profiles = determine_profiles_for_port (info->ports[i], profile_list);
 +                        port_list = g_list_prepend (port_list, port);
 +                }
 +
 +                gvc_mixer_card_set_profiles (card, profile_list);
 +                gvc_mixer_card_set_ports (card, port_list);
 +                is_new = TRUE;
 +        }
 +
 +        gvc_mixer_card_set_name (card, pa_proplist_gets (info->proplist, "device.description"));
 +        gvc_mixer_card_set_icon_name (card, pa_proplist_gets (info->proplist, "device.icon_name"));
 +        gvc_mixer_card_set_profile (card, info->active_profile->name);
 +
 +        if (is_new) {
 +                g_hash_table_insert (control->priv->cards,
 +                                     GUINT_TO_POINTER (info->index),
 +                                     card);
 +        }
 +
 +        card_ports = gvc_mixer_card_get_ports (card);
 +
 +        if (card_ports == NULL && is_new) {
 +                g_debug ("Portless card just registered - %s", gvc_mixer_card_get_name (card));
 +                create_ui_device_from_card (control, card);
 +        }
 +
 +        for (m = card_ports; m != NULL; m = m->next) {
 +                GvcMixerCardPort *card_port;
 +                card_port = m->data;
 +                if (is_new)
 +                        create_ui_device_from_port (control, card_port, card);
 +                else {
 +                        for (i = 0; i < info->n_ports; i++) {
 +                                if (g_strcmp0 (card_port->port, info->ports[i]->name) == 0) {
 +                                        if ((card_port->available == PA_PORT_AVAILABLE_NO) != (info->ports[i]->available == PA_PORT_AVAILABLE_NO)) {
 +                                                card_port->available = info->ports[i]->available;
 +                                                g_debug ("sync port availability on card %i, card port name '%s', new available value %i",
 +                                                          gvc_mixer_card_get_index (card),
 +                                                          card_port->port,
 +                                                          card_port->available);
 +                                                match_card_port_with_existing_device (control,
 +                                                                                      card_port,
 +                                                                                      card,
 +                                                                                      card_port->available != PA_PORT_AVAILABLE_NO);
 +                                        }
 +                                }
 +                        }
 +                }
 +        }
 +
 +#ifdef HAVE_ALSA
 +        check_audio_device_selection_needed (control, info);
 +#endif /* HAVE_ALSA */
 +
 +        g_signal_emit (G_OBJECT (control),
 +                       signals[CARD_ADDED],
 +                       0,
 +                       info->index);
 +}
 +
 +static void
 +_pa_context_get_sink_info_cb (pa_context         *context,
 +                              const pa_sink_info *i,
 +                              int                 eol,
 +                              void               *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                if (pa_context_errno (context) == PA_ERR_NOENTITY) {
 +                        return;
 +                }
 +
 +                g_warning ("Sink callback failure");
 +                return;
 +        }
 +
 +        if (eol > 0) {
 +                dec_outstanding (control);
 +                return;
 +        }
 +
 +        update_sink (control, i);
 +}
 +
 +static void
 +_pa_context_get_source_info_cb (pa_context           *context,
 +                                const pa_source_info *i,
 +                                int                   eol,
 +                                void                 *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                if (pa_context_errno (context) == PA_ERR_NOENTITY) {
 +                        return;
 +                }
 +
 +                g_warning ("Source callback failure");
 +                return;
 +        }
 +
 +        if (eol > 0) {
 +                dec_outstanding (control);
 +                return;
 +        }
 +
 +        update_source (control, i);
 +}
 +
 +static void
 +_pa_context_get_sink_input_info_cb (pa_context               *context,
 +                                    const pa_sink_input_info *i,
 +                                    int                       eol,
 +                                    void                     *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                if (pa_context_errno (context) == PA_ERR_NOENTITY) {
 +                        return;
 +                }
 +
 +                g_warning ("Sink input callback failure");
 +                return;
 +        }
 +
 +        if (eol > 0) {
 +                dec_outstanding (control);
 +                return;
 +        }
 +
 +        update_sink_input (control, i);
 +}
 +
 +static void
 +_pa_context_get_source_output_info_cb (pa_context                  *context,
 +                                       const pa_source_output_info *i,
 +                                       int                          eol,
 +                                       void                        *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                if (pa_context_errno (context) == PA_ERR_NOENTITY) {
 +                        return;
 +                }
 +
 +                g_warning ("Source output callback failure");
 +                return;
 +        }
 +
 +        if (eol > 0)  {
 +                dec_outstanding (control);
 +                return;
 +        }
 +
 +        update_source_output (control, i);
 +}
 +
 +static void
 +_pa_context_get_client_info_cb (pa_context           *context,
 +                                const pa_client_info *i,
 +                                int                   eol,
 +                                void                 *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                if (pa_context_errno (context) == PA_ERR_NOENTITY) {
 +                        return;
 +                }
 +
 +                g_warning ("Client callback failure");
 +                return;
 +        }
 +
 +        if (eol > 0) {
 +                dec_outstanding (control);
 +                return;
 +        }
 +
 +        update_client (control, i);
 +}
 +
 +static void
 +_pa_context_get_card_info_by_index_cb (pa_context *context,
 +                                       const pa_card_info *i,
 +                                       int eol,
 +                                       void *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                if (pa_context_errno (context) == PA_ERR_NOENTITY)
 +                        return;
 +
 +                g_warning ("Card callback failure");
 +                return;
 +        }
 +
 +        if (eol > 0) {
 +                dec_outstanding (control);
 +                return;
 +        }
 +
 +        update_card (control, i);
 +}
 +
 +static void
 +_pa_context_get_server_info_cb (pa_context           *context,
 +                                const pa_server_info *i,
 +                                void                 *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (i == NULL) {
 +                g_warning ("Server info callback failure");
 +                return;
 +        }
 +        g_debug ("get server info");
 +        update_server (control, i);
 +        dec_outstanding (control);
 +}
 +
 +static void
 +remove_event_role_stream (GvcMixerControl *control)
 +{
 +        g_debug ("Removing event role");
 +}
 +
 +static void
 +update_event_role_stream (GvcMixerControl                  *control,
 +                          const pa_ext_stream_restore_info *info)
 +{
 +        GvcMixerStream *stream;
 +        gboolean        is_new;
 +        pa_volume_t     max_volume;
 +
 +        if (strcmp (info->name, "sink-input-by-media-role:event") != 0) {
 +                return;
 +        }
 +
 +#if 0
 +        g_debug ("Updating event role: name='%s' device='%s'",
 +                 info->name,
 +                 info->device);
 +#endif
 +
 +        is_new = FALSE;
 +
 +        if (!control->priv->event_sink_input_is_set) {
 +                pa_channel_map pa_map;
 +                GvcChannelMap *map;
 +
 +                pa_map.channels = 1;
 +                pa_map.map[0] = PA_CHANNEL_POSITION_MONO;
 +                map = gvc_channel_map_new_from_pa_channel_map (&pa_map);
 +
 +                stream = gvc_mixer_event_role_new (control->priv->pa_context,
 +                                                   info->device,
 +                                                   map);
 +                control->priv->event_sink_input_id = gvc_mixer_stream_get_id (stream);
 +                control->priv->event_sink_input_is_set = TRUE;
 +
 +                is_new = TRUE;
 +        } else {
 +                stream = g_hash_table_lookup (control->priv->all_streams,
 +                                              GUINT_TO_POINTER (control->priv->event_sink_input_id));
 +        }
 +
 +        max_volume = pa_cvolume_max (&info->volume);
 +
 +        gvc_mixer_stream_set_name (stream, _("System Sounds"));
- remove_all_streams (GvcMixerControl *control, GHashTable *hash_table)
++        gvc_mixer_stream_set_icon_name (stream, "audio-x-generic");
 +        gvc_mixer_stream_set_volume (stream, (guint)max_volume);
 +        gvc_mixer_stream_set_is_muted (stream, info->mute);
 +
 +        if (is_new) {
 +                add_stream (control, stream);
 +        }
 +}
 +
 +static void
 +_pa_ext_stream_restore_read_cb (pa_context                       *context,
 +                                const pa_ext_stream_restore_info *i,
 +                                int                               eol,
 +                                void                             *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        if (eol < 0) {
 +                g_debug ("Failed to initialized stream_restore extension: %s",
 +                         pa_strerror (pa_context_errno (context)));
 +                remove_event_role_stream (control);
 +                return;
 +        }
 +
 +        if (eol > 0) {
 +                dec_outstanding (control);
 +                /* If we don't have an event stream to restore, then
 +                 * set one up with a default 100% volume */
 +                if (!control->priv->event_sink_input_is_set) {
 +                        pa_ext_stream_restore_info info;
 +
 +                        memset (&info, 0, sizeof(info));
 +                        info.name = "sink-input-by-media-role:event";
 +                        info.volume.channels = 1;
 +                        info.volume.values[0] = PA_VOLUME_NORM;
 +                        update_event_role_stream (control, &info);
 +                }
 +                return;
 +        }
 +
 +        update_event_role_stream (control, i);
 +}
 +
 +static void
 +_pa_ext_stream_restore_subscribe_cb (pa_context *context,
 +                                     void       *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +        pa_operation    *o;
 +
 +        o = pa_ext_stream_restore_read (context,
 +                                        _pa_ext_stream_restore_read_cb,
 +                                        control);
 +        if (o == NULL) {
 +                g_warning ("pa_ext_stream_restore_read() failed");
 +                return;
 +        }
 +
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_server_info (GvcMixerControl *control,
 +                        int              index)
 +{
 +        pa_operation *o;
 +
 +        o = pa_context_get_server_info (control->priv->pa_context,
 +                                        _pa_context_get_server_info_cb,
 +                                        control);
 +        if (o == NULL) {
 +                g_warning ("pa_context_get_server_info() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_client_info (GvcMixerControl *control,
 +                        int              index)
 +{
 +        pa_operation *o;
 +
 +        if (index < 0) {
 +                o = pa_context_get_client_info_list (control->priv->pa_context,
 +                                                     _pa_context_get_client_info_cb,
 +                                                     control);
 +        } else {
 +                o = pa_context_get_client_info (control->priv->pa_context,
 +                                                index,
 +                                                _pa_context_get_client_info_cb,
 +                                                control);
 +        }
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_client_info_list() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_card (GvcMixerControl *control,
 +                 int              index)
 +{
 +        pa_operation *o;
 +
 +        if (index < 0) {
 +                o = pa_context_get_card_info_list (control->priv->pa_context,
 +                                                   _pa_context_get_card_info_by_index_cb,
 +                                                   control);
 +        } else {
 +                o = pa_context_get_card_info_by_index (control->priv->pa_context,
 +                                                       index,
 +                                                       _pa_context_get_card_info_by_index_cb,
 +                                                       control);
 +        }
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_get_card_info_by_index() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_sink_info (GvcMixerControl *control,
 +                      int              index)
 +{
 +        pa_operation *o;
 +
 +        if (index < 0) {
 +                o = pa_context_get_sink_info_list (control->priv->pa_context,
 +                                                   _pa_context_get_sink_info_cb,
 +                                                   control);
 +        } else {
 +                o = pa_context_get_sink_info_by_index (control->priv->pa_context,
 +                                                       index,
 +                                                       _pa_context_get_sink_info_cb,
 +                                                       control);
 +        }
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_get_sink_info_list() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_source_info (GvcMixerControl *control,
 +                        int              index)
 +{
 +        pa_operation *o;
 +
 +        if (index < 0) {
 +                o = pa_context_get_source_info_list (control->priv->pa_context,
 +                                                     _pa_context_get_source_info_cb,
 +                                                     control);
 +        } else {
 +                o = pa_context_get_source_info_by_index(control->priv->pa_context,
 +                                                        index,
 +                                                        _pa_context_get_source_info_cb,
 +                                                        control);
 +        }
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_get_source_info_list() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_sink_input_info (GvcMixerControl *control,
 +                            int              index)
 +{
 +        pa_operation *o;
 +
 +        if (index < 0) {
 +                o = pa_context_get_sink_input_info_list (control->priv->pa_context,
 +                                                         _pa_context_get_sink_input_info_cb,
 +                                                         control);
 +        } else {
 +                o = pa_context_get_sink_input_info (control->priv->pa_context,
 +                                                    index,
 +                                                    _pa_context_get_sink_input_info_cb,
 +                                                    control);
 +        }
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_get_sink_input_info_list() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +req_update_source_output_info (GvcMixerControl *control,
 +                               int              index)
 +{
 +        pa_operation *o;
 +
 +        if (index < 0) {
 +                o = pa_context_get_source_output_info_list (control->priv->pa_context,
 +                                                            _pa_context_get_source_output_info_cb,
 +                                                            control);
 +        } else {
 +                o = pa_context_get_source_output_info (control->priv->pa_context,
 +                                                       index,
 +                                                       _pa_context_get_source_output_info_cb,
 +                                                       control);
 +        }
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_get_source_output_info_list() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +}
 +
 +static void
 +remove_client (GvcMixerControl *control,
 +               guint            index)
 +{
 +        g_hash_table_remove (control->priv->clients,
 +                             GUINT_TO_POINTER (index));
 +}
 +
 +static void
 +remove_card (GvcMixerControl *control,
 +             guint            index)
 +{
 +
 +        GList *devices, *d;
 +
 +        devices = g_list_concat (g_hash_table_get_values (control->priv->ui_inputs),
 +                                 g_hash_table_get_values (control->priv->ui_outputs));
 +
 +        for (d = devices; d != NULL; d = d->next) {
 +                GvcMixerCard *card;
 +                GvcMixerUIDevice *device = d->data;
 +
 +                g_object_get (G_OBJECT (device), "card", &card, NULL);
 +
++                if (card == NULL)
++                        continue;
++
 +                if (gvc_mixer_card_get_index (card) == index) {
 +                        g_signal_emit (G_OBJECT (control),
 +                                       signals[gvc_mixer_ui_device_is_output (device) ? OUTPUT_REMOVED : INPUT_REMOVED],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (device));
 +                        g_debug ("Card removal remove device %s",
 +                                 gvc_mixer_ui_device_get_description (device));
 +                        g_hash_table_remove (gvc_mixer_ui_device_is_output (device) ? control->priv->ui_outputs : control->priv->ui_inputs,
 +                                             GUINT_TO_POINTER (gvc_mixer_ui_device_get_id (device)));
 +                }
 +        }
 +
 +        g_list_free (devices);
 +
 +        g_hash_table_remove (control->priv->cards,
 +                             GUINT_TO_POINTER (index));
 +
 +        g_signal_emit (G_OBJECT (control),
 +                       signals[CARD_REMOVED],
 +                       0,
 +                       index);
 +}
 +
 +static void
 +remove_sink (GvcMixerControl *control,
 +             guint            index)
 +{
 +        GvcMixerStream   *stream;
 +        GvcMixerUIDevice *device;
 +
 +        g_debug ("Removing sink: index=%u", index);
 +
 +        stream = g_hash_table_lookup (control->priv->sinks,
 +                                      GUINT_TO_POINTER (index));
 +        if (stream == NULL)
 +                return;
 +
 +        device = gvc_mixer_control_lookup_device_from_stream (control, stream);
 +
 +        if (device != NULL) {
 +                gvc_mixer_ui_device_invalidate_stream (device);
 +                if (!gvc_mixer_ui_device_has_ports (device)) {
 +                        g_signal_emit (G_OBJECT (control),
 +                                       signals[OUTPUT_REMOVED],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (device));
 +                } else {
 +                        GList *devices, *d;
 +
 +                        devices = g_hash_table_get_values (control->priv->ui_outputs);
 +
 +                        for (d = devices; d != NULL; d = d->next) {
 +                                guint stream_id = GVC_MIXER_UI_DEVICE_INVALID;
 +                                device = d->data;
 +                                g_object_get (G_OBJECT (device),
 +                                             "stream-id", &stream_id,
 +                                              NULL);
 +                                if (stream_id == gvc_mixer_stream_get_id (stream))
 +                                        gvc_mixer_ui_device_invalidate_stream (device);
 +                        }
 +
 +                        g_list_free (devices);
 +                }
 +        }
 +
 +        g_hash_table_remove (control->priv->sinks,
 +                             GUINT_TO_POINTER (index));
 +
 +        remove_stream (control, stream);
 +}
 +
 +static void
 +remove_source (GvcMixerControl *control,
 +               guint            index)
 +{
 +        GvcMixerStream   *stream;
 +        GvcMixerUIDevice *device;
 +
 +        g_debug ("Removing source: index=%u", index);
 +
 +        stream = g_hash_table_lookup (control->priv->sources,
 +                                      GUINT_TO_POINTER (index));
 +        if (stream == NULL)
 +                return;
 +
 +        device = gvc_mixer_control_lookup_device_from_stream (control, stream);
 +
 +        if (device != NULL) {
 +                gvc_mixer_ui_device_invalidate_stream (device);
 +                if (!gvc_mixer_ui_device_has_ports (device)) {
 +                        g_signal_emit (G_OBJECT (control),
 +                                       signals[INPUT_REMOVED],
 +                                       0,
 +                                       gvc_mixer_ui_device_get_id (device));
 +                } else {
 +                        GList *devices, *d;
 +
 +                        devices = g_hash_table_get_values (control->priv->ui_inputs);
 +
 +                        for (d = devices; d != NULL; d = d->next) {
 +                                guint stream_id = GVC_MIXER_UI_DEVICE_INVALID;
 +                                device = d->data;
 +                                g_object_get (G_OBJECT (device),
 +                                             "stream-id", &stream_id,
 +                                              NULL);
 +                                if (stream_id == gvc_mixer_stream_get_id (stream))
 +                                        gvc_mixer_ui_device_invalidate_stream (device);
 +                        }
 +
 +                        g_list_free (devices);
 +                }
 +        }
 +
 +        g_hash_table_remove (control->priv->sources,
 +                             GUINT_TO_POINTER (index));
 +
 +        remove_stream (control, stream);
 +}
 +
 +static void
 +remove_sink_input (GvcMixerControl *control,
 +                   guint            index)
 +{
 +        GvcMixerStream *stream;
 +
 +        g_debug ("Removing sink input: index=%u", index);
 +
 +        stream = g_hash_table_lookup (control->priv->sink_inputs,
 +                                      GUINT_TO_POINTER (index));
 +        if (stream == NULL) {
 +                return;
 +        }
 +        g_hash_table_remove (control->priv->sink_inputs,
 +                             GUINT_TO_POINTER (index));
 +
 +        remove_stream (control, stream);
 +}
 +
 +static void
 +remove_source_output (GvcMixerControl *control,
 +                      guint            index)
 +{
 +        GvcMixerStream *stream;
 +
 +        g_debug ("Removing source output: index=%u", index);
 +
 +        stream = g_hash_table_lookup (control->priv->source_outputs,
 +                                      GUINT_TO_POINTER (index));
 +        if (stream == NULL) {
 +                return;
 +        }
 +        g_hash_table_remove (control->priv->source_outputs,
 +                             GUINT_TO_POINTER (index));
 +
 +        remove_stream (control, stream);
 +}
 +
 +static void
 +_pa_context_subscribe_cb (pa_context                  *context,
 +                          pa_subscription_event_type_t t,
 +                          uint32_t                     index,
 +                          void                        *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
 +        case PA_SUBSCRIPTION_EVENT_SINK:
 +                if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
 +                        remove_sink (control, index);
 +                } else {
 +                        req_update_sink_info (control, index);
 +                }
 +                break;
 +
 +        case PA_SUBSCRIPTION_EVENT_SOURCE:
 +                if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
 +                        remove_source (control, index);
 +                } else {
 +                        req_update_source_info (control, index);
 +                }
 +                break;
 +
 +        case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
 +                if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
 +                        remove_sink_input (control, index);
 +                } else {
 +                        req_update_sink_input_info (control, index);
 +                }
 +                break;
 +
 +        case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
 +                if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
 +                        remove_source_output (control, index);
 +                } else {
 +                        req_update_source_output_info (control, index);
 +                }
 +                break;
 +
 +        case PA_SUBSCRIPTION_EVENT_CLIENT:
 +                if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
 +                        remove_client (control, index);
 +                } else {
 +                        req_update_client_info (control, index);
 +                }
 +                break;
 +
 +        case PA_SUBSCRIPTION_EVENT_SERVER:
 +                req_update_server_info (control, index);
 +                break;
 +
 +        case PA_SUBSCRIPTION_EVENT_CARD:
 +                if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
 +                        remove_card (control, index);
 +                } else {
 +                        req_update_card (control, index);
 +                }
 +                break;
 +        default:
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_control_ready (GvcMixerControl *control)
 +{
 +        pa_operation *o;
 +
 +        pa_context_set_subscribe_callback (control->priv->pa_context,
 +                                           _pa_context_subscribe_cb,
 +                                           control);
 +        o = pa_context_subscribe (control->priv->pa_context,
 +                                  (pa_subscription_mask_t)
 +                                  (PA_SUBSCRIPTION_MASK_SINK|
 +                                   PA_SUBSCRIPTION_MASK_SOURCE|
 +                                   PA_SUBSCRIPTION_MASK_SINK_INPUT|
 +                                   PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT|
 +                                   PA_SUBSCRIPTION_MASK_CLIENT|
 +                                   PA_SUBSCRIPTION_MASK_SERVER|
 +                                   PA_SUBSCRIPTION_MASK_CARD),
 +                                  NULL,
 +                                  NULL);
 +
 +        if (o == NULL) {
 +                g_warning ("pa_context_subscribe() failed");
 +                return;
 +        }
 +        pa_operation_unref (o);
 +
 +        req_update_server_info (control, -1);
 +        req_update_card (control, -1);
 +        req_update_client_info (control, -1);
 +        req_update_sink_info (control, -1);
 +        req_update_source_info (control, -1);
 +        req_update_sink_input_info (control, -1);
 +        req_update_source_output_info (control, -1);
 +
 +        control->priv->server_protocol_version = pa_context_get_server_protocol_version (control->priv->pa_context);
 +
 +        control->priv->n_outstanding = 6;
 +
 +        /* This call is not always supported */
 +        o = pa_ext_stream_restore_read (control->priv->pa_context,
 +                                        _pa_ext_stream_restore_read_cb,
 +                                        control);
 +        if (o != NULL) {
 +                pa_operation_unref (o);
 +                control->priv->n_outstanding++;
 +
 +                pa_ext_stream_restore_set_subscribe_cb (control->priv->pa_context,
 +                                                        _pa_ext_stream_restore_subscribe_cb,
 +                                                        control);
 +
 +                o = pa_ext_stream_restore_subscribe (control->priv->pa_context,
 +                                                     1,
 +                                                     NULL,
 +                                                     NULL);
 +                if (o != NULL) {
 +                        pa_operation_unref (o);
 +                }
 +
 +        } else {
 +                g_debug ("Failed to initialized stream_restore extension: %s",
 +                         pa_strerror (pa_context_errno (control->priv->pa_context)));
 +        }
 +}
 +
 +static void
 +gvc_mixer_new_pa_context (GvcMixerControl *self)
 +{
 +        pa_proplist     *proplist;
 +
 +        g_return_if_fail (self);
 +        g_return_if_fail (!self->priv->pa_context);
 +
 +        proplist = pa_proplist_new ();
 +        pa_proplist_sets (proplist,
 +                          PA_PROP_APPLICATION_NAME,
 +                          self->priv->name);
 +        pa_proplist_sets (proplist,
 +                          PA_PROP_APPLICATION_ID,
 +                          "org.gnome.VolumeControl");
 +        pa_proplist_sets (proplist,
 +                          PA_PROP_APPLICATION_ICON_NAME,
 +                          "multimedia-volume-control");
 +        pa_proplist_sets (proplist,
 +                          PA_PROP_APPLICATION_VERSION,
 +                          PACKAGE_VERSION);
 +
 +        self->priv->pa_context = pa_context_new_with_proplist (self->priv->pa_api, NULL, proplist);
 +
 +        pa_proplist_free (proplist);
 +        g_assert (self->priv->pa_context);
 +}
 +
 +static void
-                 remove_stream (control, value);
-                 g_hash_table_iter_remove (&iter);
++remove_all_items (GvcMixerControl *control,
++                  GHashTable *hash_table,
++                  void (*remove_item)(GvcMixerControl *control, guint index))
 +{
 +        GHashTableIter iter;
 +        gpointer key, value;
 +
 +        g_hash_table_iter_init (&iter, hash_table);
 +        while (g_hash_table_iter_next (&iter, &key, &value)) {
-         GHashTableIter iter;
-         gpointer key, value;
++                if (remove_item) {
++                        remove_item (control, GPOINTER_TO_UINT (key));
++                        g_hash_table_remove (hash_table, key);
++                        g_hash_table_iter_init (&iter, hash_table);
++                } else {
++                        g_hash_table_iter_remove (&iter);
++                }
 +        }
 +}
 +
 +static gboolean
 +idle_reconnect (gpointer data)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (data);
-         remove_all_streams (control, control->priv->sinks);
-         remove_all_streams (control, control->priv->sources);
-         remove_all_streams (control, control->priv->sink_inputs);
-         remove_all_streams (control, control->priv->source_outputs);
- 
-         g_hash_table_iter_init (&iter, control->priv->clients);
-         while (g_hash_table_iter_next (&iter, &key, &value))
-                 g_hash_table_iter_remove (&iter);
- 
 +
 +        g_return_val_if_fail (control, FALSE);
 +
++        g_debug ("Reconnect: clean up all objects");
++
++        remove_all_items (control, control->priv->sinks, remove_sink);
++        remove_all_items (control, control->priv->sources, remove_source);
++        remove_all_items (control, control->priv->sink_inputs, remove_sink_input);
++        remove_all_items (control, control->priv->source_outputs, remove_source_output);
++        remove_all_items (control, control->priv->cards, remove_card);
++        remove_all_items (control, control->priv->ui_inputs, NULL);
++        remove_all_items (control, control->priv->ui_outputs, NULL);
++        remove_all_items (control, control->priv->clients, remove_client);
++
++        g_debug ("Reconnect: make new connection");
++
 +        if (control->priv->pa_context) {
 +                pa_context_unref (control->priv->pa_context);
 +                control->priv->pa_context = NULL;
 +                control->priv->server_protocol_version = 0;
 +                gvc_mixer_new_pa_context (control);
 +        }
 +
-                 g_object_notify (G_OBJECT (self), "name");
 +        gvc_mixer_control_open (control); /* cannot fail */
 +
 +        control->priv->reconnect_id = 0;
 +        return FALSE;
 +}
 +
 +static void
 +_pa_context_state_cb (pa_context *context,
 +                      void       *userdata)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (userdata);
 +
 +        switch (pa_context_get_state (context)) {
 +        case PA_CONTEXT_UNCONNECTED:
 +        case PA_CONTEXT_CONNECTING:
 +        case PA_CONTEXT_AUTHORIZING:
 +        case PA_CONTEXT_SETTING_NAME:
 +                break;
 +
 +        case PA_CONTEXT_READY:
 +                gvc_mixer_control_ready (control);
 +                break;
 +
 +        case PA_CONTEXT_FAILED:
 +                control->priv->state = GVC_STATE_FAILED;
 +                g_signal_emit (control, signals[STATE_CHANGED], 0, GVC_STATE_FAILED);
 +                if (control->priv->reconnect_id == 0)
 +                        control->priv->reconnect_id = g_timeout_add_seconds (RECONNECT_DELAY, idle_reconnect, control);
 +                break;
 +
 +        case PA_CONTEXT_TERMINATED:
 +        default:
 +                /* FIXME: */
 +                break;
 +        }
 +}
 +
 +gboolean
 +gvc_mixer_control_open (GvcMixerControl *control)
 +{
 +        int res;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE);
 +        g_return_val_if_fail (control->priv->pa_context != NULL, FALSE);
 +        g_return_val_if_fail (pa_context_get_state (control->priv->pa_context) == PA_CONTEXT_UNCONNECTED, FALSE);
 +
 +        pa_context_set_state_callback (control->priv->pa_context,
 +                                       _pa_context_state_cb,
 +                                       control);
 +
 +        control->priv->state = GVC_STATE_CONNECTING;
 +        g_signal_emit (G_OBJECT (control), signals[STATE_CHANGED], 0, GVC_STATE_CONNECTING);
 +        res = pa_context_connect (control->priv->pa_context, NULL, (pa_context_flags_t) PA_CONTEXT_NOFAIL, NULL);
 +        if (res < 0) {
 +                g_warning ("Failed to connect context: %s",
 +                           pa_strerror (pa_context_errno (control->priv->pa_context)));
 +        }
 +
 +        return res;
 +}
 +
 +gboolean
 +gvc_mixer_control_close (GvcMixerControl *control)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE);
 +        g_return_val_if_fail (control->priv->pa_context != NULL, FALSE);
 +
 +        pa_context_disconnect (control->priv->pa_context);
 +
 +        control->priv->state = GVC_STATE_CLOSED;
 +        g_signal_emit (G_OBJECT (control), signals[STATE_CHANGED], 0, GVC_STATE_CLOSED);
 +        return TRUE;
 +}
 +
 +static void
 +gvc_mixer_control_dispose (GObject *object)
 +{
 +        GvcMixerControl *control = GVC_MIXER_CONTROL (object);
 +
 +        if (control->priv->reconnect_id != 0) {
 +                g_source_remove (control->priv->reconnect_id);
 +                control->priv->reconnect_id = 0;
 +        }
 +
 +        if (control->priv->pa_context != NULL) {
 +                pa_context_unref (control->priv->pa_context);
 +                control->priv->pa_context = NULL;
 +        }
 +
 +        if (control->priv->default_source_name != NULL) {
 +                g_free (control->priv->default_source_name);
 +                control->priv->default_source_name = NULL;
 +        }
 +        if (control->priv->default_sink_name != NULL) {
 +                g_free (control->priv->default_sink_name);
 +                control->priv->default_sink_name = NULL;
 +        }
 +
 +        if (control->priv->pa_mainloop != NULL) {
 +                pa_glib_mainloop_free (control->priv->pa_mainloop);
 +                control->priv->pa_mainloop = NULL;
 +        }
 +
 +        if (control->priv->all_streams != NULL) {
 +                g_hash_table_destroy (control->priv->all_streams);
 +                control->priv->all_streams = NULL;
 +        }
 +
 +        if (control->priv->sinks != NULL) {
 +                g_hash_table_destroy (control->priv->sinks);
 +                control->priv->sinks = NULL;
 +        }
 +        if (control->priv->sources != NULL) {
 +                g_hash_table_destroy (control->priv->sources);
 +                control->priv->sources = NULL;
 +        }
 +        if (control->priv->sink_inputs != NULL) {
 +                g_hash_table_destroy (control->priv->sink_inputs);
 +                control->priv->sink_inputs = NULL;
 +        }
 +        if (control->priv->source_outputs != NULL) {
 +                g_hash_table_destroy (control->priv->source_outputs);
 +                control->priv->source_outputs = NULL;
 +        }
 +        if (control->priv->clients != NULL) {
 +                g_hash_table_destroy (control->priv->clients);
 +                control->priv->clients = NULL;
 +        }
 +        if (control->priv->cards != NULL) {
 +                g_hash_table_destroy (control->priv->cards);
 +                control->priv->cards = NULL;
 +        }
 +        if (control->priv->ui_outputs != NULL) {
 +                g_hash_table_destroy (control->priv->ui_outputs);
 +                control->priv->ui_outputs = NULL;
 +        }
 +        if (control->priv->ui_inputs != NULL) {
 +                g_hash_table_destroy (control->priv->ui_inputs);
 +                control->priv->ui_inputs = NULL;
 +        }
 +
 +        free_priv_port_names (control);
 +        G_OBJECT_CLASS (gvc_mixer_control_parent_class)->dispose (object);
 +}
 +
 +static void
 +gvc_mixer_control_set_property (GObject       *object,
 +                                guint          prop_id,
 +                                const GValue  *value,
 +                                GParamSpec    *pspec)
 +{
 +        GvcMixerControl *self = GVC_MIXER_CONTROL (object);
 +
 +        switch (prop_id) {
 +        case PROP_NAME:
 +                g_free (self->priv->name);
 +                self->priv->name = g_value_dup_string (value);
-         g_object_class_install_property (object_class,
-                                          PROP_NAME,
-                                          g_param_spec_string ("name",
-                                                               "Name",
-                                                               "Name to display for this mixer control",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
++                g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_NAME]);
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_control_get_property (GObject     *object,
 +                                guint        prop_id,
 +                                GValue      *value,
 +                                GParamSpec  *pspec)
 +{
 +        GvcMixerControl *self = GVC_MIXER_CONTROL (object);
 +
 +        switch (prop_id) {
 +        case PROP_NAME:
 +                g_value_set_string (value, self->priv->name);
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +
 +static GObject *
 +gvc_mixer_control_constructor (GType                  type,
 +                               guint                  n_construct_properties,
 +                               GObjectConstructParam *construct_params)
 +{
 +        GObject         *object;
 +        GvcMixerControl *self;
 +
 +        object = G_OBJECT_CLASS (gvc_mixer_control_parent_class)->constructor (type, n_construct_properties, construct_params);
 +
 +        self = GVC_MIXER_CONTROL (object);
 +
 +        gvc_mixer_new_pa_context (self);
 +        self->priv->profile_swapping_device_id = GVC_MIXER_UI_DEVICE_INVALID;
 +
 +        return object;
 +}
 +
 +static void
 +gvc_mixer_control_class_init (GvcMixerControlClass *klass)
 +{
 +        GObjectClass   *object_class = G_OBJECT_CLASS (klass);
 +
 +        object_class->constructor = gvc_mixer_control_constructor;
 +        object_class->dispose = gvc_mixer_control_dispose;
 +        object_class->finalize = gvc_mixer_control_finalize;
 +        object_class->set_property = gvc_mixer_control_set_property;
 +        object_class->get_property = gvc_mixer_control_get_property;
 +
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++        obj_props[PROP_NAME] = g_param_spec_string ("name",
++                                                    "Name",
++                                                    "Name to display for this mixer control",
++                                                    NULL,
++                                                    G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        g_object_class_install_properties (object_class, N_PROPS, obj_props);
 +
 +        signals [STATE_CHANGED] =
 +                g_signal_new ("state-changed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, state_changed),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [STREAM_ADDED] =
 +                g_signal_new ("stream-added",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, stream_added),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [STREAM_REMOVED] =
 +                g_signal_new ("stream-removed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, stream_removed),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [STREAM_CHANGED] =
 +                g_signal_new ("stream-changed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, stream_changed),
-                               NULL, NULL,
-                               g_cclosure_marshal_generic,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [AUDIO_DEVICE_SELECTION_NEEDED] =
 +                g_signal_new ("audio-device-selection-needed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              0,
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_BOOLEAN, G_TYPE_UINT);
 +        signals [CARD_ADDED] =
 +                g_signal_new ("card-added",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, card_added),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [CARD_REMOVED] =
 +                g_signal_new ("card-removed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, card_removed),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [DEFAULT_SINK_CHANGED] =
 +                g_signal_new ("default-sink-changed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, default_sink_changed),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [DEFAULT_SOURCE_CHANGED] =
 +                g_signal_new ("default-source-changed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, default_source_changed),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [ACTIVE_OUTPUT_UPDATE] =
 +                g_signal_new ("active-output-update",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, active_output_update),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [ACTIVE_INPUT_UPDATE] =
 +                g_signal_new ("active-input-update",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, active_input_update),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [OUTPUT_ADDED] =
 +                g_signal_new ("output-added",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, output_added),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [INPUT_ADDED] =
 +                g_signal_new ("input-added",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, input_added),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [OUTPUT_REMOVED] =
 +                g_signal_new ("output-removed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, output_removed),
-                               NULL, NULL,
-                               g_cclosure_marshal_VOID__UINT,
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +        signals [INPUT_REMOVED] =
 +                g_signal_new ("input-removed",
 +                              G_TYPE_FROM_CLASS (klass),
 +                              G_SIGNAL_RUN_LAST,
 +                              G_STRUCT_OFFSET (GvcMixerControlClass, input_removed),
++                              NULL, NULL, NULL,
 +                              G_TYPE_NONE, 1, G_TYPE_UINT);
 +}
 +
 +
 +static void
 +gvc_mixer_control_init (GvcMixerControl *control)
 +{
 +        control->priv = gvc_mixer_control_get_instance_private (control);
 +
 +        control->priv->pa_mainloop = pa_glib_mainloop_new (g_main_context_default ());
 +        g_assert (control->priv->pa_mainloop);
 +
 +        control->priv->pa_api = pa_glib_mainloop_get_api (control->priv->pa_mainloop);
 +        g_assert (control->priv->pa_api);
 +
 +        control->priv->all_streams = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->sinks = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->sources = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->sink_inputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->source_outputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->cards = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->ui_outputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +        control->priv->ui_inputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 +
 +        control->priv->clients = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_free);
 +
 +#ifdef HAVE_ALSA
 +        control->priv->headset_card = -1;
 +#endif /* HAVE_ALSA */
 +
 +        control->priv->state = GVC_STATE_CLOSED;
 +}
 +
 +static void
 +gvc_mixer_control_finalize (GObject *object)
 +{
 +        GvcMixerControl *mixer_control;
 +
 +        g_return_if_fail (object != NULL);
 +        g_return_if_fail (GVC_IS_MIXER_CONTROL (object));
 +
 +        mixer_control = GVC_MIXER_CONTROL (object);
 +        g_free (mixer_control->priv->name);
 +        mixer_control->priv->name = NULL;
 +
 +        g_return_if_fail (mixer_control->priv != NULL);
 +        G_OBJECT_CLASS (gvc_mixer_control_parent_class)->finalize (object);
 +}
 +
 +GvcMixerControl *
 +gvc_mixer_control_new (const char *name)
 +{
 +        GObject *control;
 +        control = g_object_new (GVC_TYPE_MIXER_CONTROL,
 +                                "name", name,
 +                                NULL);
 +        return GVC_MIXER_CONTROL (control);
 +}
 +
 +gdouble
 +gvc_mixer_control_get_vol_max_norm (GvcMixerControl *control)
 +{
 +      g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), 0);
 +      return (gdouble) PA_VOLUME_NORM;
 +}
 +
 +gdouble
 +gvc_mixer_control_get_vol_max_amplified (GvcMixerControl *control)
 +{
 +      g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), 0);
 +      return (gdouble) PA_VOLUME_UI_MAX;
 +}
index 9f5e26ad93199e8f4cb7b3840c9e7f178e313c14,0000000000000000000000000000000000000000..272edb04c67266465b7309acd0c3138a5b7d9b66
mode 100644,000000..100644
--- /dev/null
@@@ -1,228 -1,0 +1,229 @@@
-         PROP_DEVICE
 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 + *
 + * Copyright (C) 2008 William Jon McCann
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 + *
 + */
 +
 +#include "config.h"
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <unistd.h>
 +
 +#include <glib.h>
 +#include <glib/gi18n-lib.h>
 +
 +#include <pulse/pulseaudio.h>
 +#include <pulse/ext-stream-restore.h>
 +
 +#include "gvc-mixer-event-role.h"
 +#include "gvc-mixer-stream-private.h"
 +#include "gvc-channel-map-private.h"
 +
 +struct GvcMixerEventRolePrivate
 +{
 +        char          *device;
 +};
 +
 +enum
 +{
 +        PROP_0,
-         g_object_notify (G_OBJECT (role), "device");
++        PROP_DEVICE,
++        N_PROPS
 +};
++static GParamSpec *obj_props[N_PROPS] = { NULL, };
 +
 +static void     gvc_mixer_event_role_finalize   (GObject            *object);
 +
 +G_DEFINE_TYPE_WITH_PRIVATE (GvcMixerEventRole, gvc_mixer_event_role, GVC_TYPE_MIXER_STREAM)
 +
 +static gboolean
 +update_settings (GvcMixerEventRole *role,
 +                 gboolean           is_muted,
 +                 gpointer          *op)
 +{
 +        pa_operation              *o;
 +        const GvcChannelMap       *map;
 +        pa_context                *context;
 +        pa_ext_stream_restore_info info;
 +
 +        map = gvc_mixer_stream_get_channel_map (GVC_MIXER_STREAM(role));
 +
 +        info.volume = *gvc_channel_map_get_cvolume(map);
 +        info.name = "sink-input-by-media-role:event";
 +        info.channel_map = *gvc_channel_map_get_pa_channel_map(map);
 +        info.device = role->priv->device;
 +        info.mute = is_muted;
 +
 +        context = gvc_mixer_stream_get_pa_context (GVC_MIXER_STREAM (role));
 +
 +        o = pa_ext_stream_restore_write (context,
 +                                         PA_UPDATE_REPLACE,
 +                                         &info,
 +                                         1,
 +                                         TRUE,
 +                                         NULL,
 +                                         NULL);
 +
 +        if (o == NULL) {
 +                g_warning ("pa_ext_stream_restore_write() failed");
 +                return FALSE;
 +        }
 +
 +        if (op != NULL)
 +                *op = o;
 +
 +        return TRUE;
 +}
 +
 +static gboolean
 +gvc_mixer_event_role_push_volume (GvcMixerStream *stream, gpointer *op)
 +{
 +        return update_settings (GVC_MIXER_EVENT_ROLE (stream),
 +                                gvc_mixer_stream_get_is_muted (stream), op);
 +}
 +
 +static gboolean
 +gvc_mixer_event_role_change_is_muted (GvcMixerStream *stream,
 +                                      gboolean        is_muted)
 +{
 +        /* Apply change straight away so that we don't get a race with
 +         * gvc_mixer_event_role_push_volume().
 +         * See https://bugs.freedesktop.org/show_bug.cgi?id=51413 */
 +        gvc_mixer_stream_set_is_muted (stream, is_muted);
 +        return update_settings (GVC_MIXER_EVENT_ROLE (stream),
 +                                is_muted, NULL);
 +}
 +
 +static gboolean
 +gvc_mixer_event_role_set_device (GvcMixerEventRole *role,
 +                                 const char        *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_EVENT_ROLE (role), FALSE);
 +
 +        g_free (role->priv->device);
 +        role->priv->device = g_strdup (device);
-         g_object_class_install_property (object_class,
-                                          PROP_DEVICE,
-                                          g_param_spec_string ("device",
-                                                               "Device",
-                                                               "Device",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
++        g_object_notify_by_pspec (G_OBJECT (role), obj_props[PROP_DEVICE]);
 +
 +        return TRUE;
 +}
 +
 +static void
 +gvc_mixer_event_role_set_property (GObject       *object,
 +                                   guint          prop_id,
 +                                   const GValue  *value,
 +                                   GParamSpec    *pspec)
 +{
 +        GvcMixerEventRole *self = GVC_MIXER_EVENT_ROLE (object);
 +
 +        switch (prop_id) {
 +        case PROP_DEVICE:
 +                gvc_mixer_event_role_set_device (self, g_value_get_string (value));
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_event_role_get_property (GObject     *object,
 +                                   guint        prop_id,
 +                                   GValue      *value,
 +                                   GParamSpec  *pspec)
 +{
 +        GvcMixerEventRole *self = GVC_MIXER_EVENT_ROLE (object);
 +
 +        switch (prop_id) {
 +        case PROP_DEVICE:
 +                g_value_set_string (value, self->priv->device);
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_event_role_class_init (GvcMixerEventRoleClass *klass)
 +{
 +        GObjectClass        *object_class = G_OBJECT_CLASS (klass);
 +        GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass);
 +
 +        object_class->finalize = gvc_mixer_event_role_finalize;
 +        object_class->set_property = gvc_mixer_event_role_set_property;
 +        object_class->get_property = gvc_mixer_event_role_get_property;
 +
 +        stream_class->push_volume = gvc_mixer_event_role_push_volume;
 +        stream_class->change_is_muted = gvc_mixer_event_role_change_is_muted;
 +
++        obj_props[PROP_DEVICE] = g_param_spec_string ("device",
++                                                      "Device",
++                                                      "Device",
++                                                      NULL,
++                                                      G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        g_object_class_install_properties (object_class, N_PROPS, obj_props);
 +}
 +
 +static void
 +gvc_mixer_event_role_init (GvcMixerEventRole *event_role)
 +{
 +        event_role->priv = gvc_mixer_event_role_get_instance_private (event_role);
 +
 +}
 +
 +static void
 +gvc_mixer_event_role_finalize (GObject *object)
 +{
 +        GvcMixerEventRole *mixer_event_role;
 +
 +        g_return_if_fail (object != NULL);
 +        g_return_if_fail (GVC_IS_MIXER_EVENT_ROLE (object));
 +
 +        mixer_event_role = GVC_MIXER_EVENT_ROLE (object);
 +
 +        g_return_if_fail (mixer_event_role->priv != NULL);
 +
 +        g_free (mixer_event_role->priv->device);
 +
 +        G_OBJECT_CLASS (gvc_mixer_event_role_parent_class)->finalize (object);
 +}
 +
 +/**
 + * gvc_mixer_event_role_new: (skip)
 + * @context:
 + * @device:
 + * @channel_map:
 + *
 + * Returns:
 + */
 +GvcMixerStream *
 +gvc_mixer_event_role_new (pa_context *context,
 +                          const char *device,
 +                          GvcChannelMap *channel_map)
 +{
 +        GObject *object;
 +
 +        object = g_object_new (GVC_TYPE_MIXER_EVENT_ROLE,
 +                               "pa-context", context,
 +                               "index", 0,
 +                               "device", device,
 +                               "channel-map", channel_map,
 +                               NULL);
 +
 +        return GVC_MIXER_STREAM (object);
 +}
index c324900b95a5bdb4dda7d0852f82b8dfaf2cea60,0000000000000000000000000000000000000000..f9bcc40a2276c9df0187993d987aab4559c2d72c
mode 100644,000000..100644
--- /dev/null
@@@ -1,1090 -1,0 +1,1055 @@@
-                 g_object_notify (G_OBJECT (stream), "volume");
 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
 + *
 + * Copyright (C) 2008 William Jon McCann
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 + *
 + */
 +
 +#include "config.h"
 +
 +#include <stdlib.h>
 +#include <stdio.h>
 +#include <unistd.h>
 +
 +#include <glib.h>
 +#include <glib/gi18n-lib.h>
 +
 +#include <pulse/pulseaudio.h>
 +
 +#include "gvc-mixer-stream.h"
 +#include "gvc-mixer-stream-private.h"
 +#include "gvc-channel-map-private.h"
 +#include "gvc-enum-types.h"
 +
 +static guint32 stream_serial = 1;
 +
 +struct GvcMixerStreamPrivate
 +{
 +        pa_context    *pa_context;
 +        guint          id;
 +        guint          index;
 +        guint          card_index;
 +        GvcChannelMap *channel_map;
 +        char          *name;
 +        char          *description;
 +        char          *application_id;
 +        char          *icon_name;
 +        char          *form_factor;
 +        char          *sysfs_path;
 +        gboolean       is_muted;
 +        gboolean       can_decibel;
 +        gboolean       is_event_stream;
 +        gboolean       is_virtual;
 +        pa_volume_t    base_volume;
 +        pa_operation  *change_volume_op;
 +        char          *port;
 +        char          *human_port;
 +        GList         *ports;
 +        GvcMixerStreamState state;
 +};
 +
 +enum
 +{
 +        PROP_0,
 +        PROP_ID,
 +        PROP_PA_CONTEXT,
 +        PROP_CHANNEL_MAP,
 +        PROP_INDEX,
 +        PROP_NAME,
 +        PROP_DESCRIPTION,
 +        PROP_APPLICATION_ID,
 +        PROP_ICON_NAME,
 +        PROP_FORM_FACTOR,
 +        PROP_SYSFS_PATH,
 +        PROP_VOLUME,
 +        PROP_DECIBEL,
 +        PROP_IS_MUTED,
 +        PROP_CAN_DECIBEL,
 +        PROP_IS_EVENT_STREAM,
 +        PROP_IS_VIRTUAL,
 +        PROP_CARD_INDEX,
 +        PROP_PORT,
 +        PROP_STATE,
++        N_PROPS
 +};
++static GParamSpec *obj_props[N_PROPS] = { NULL, };
 +
 +static void     gvc_mixer_stream_finalize   (GObject            *object);
 +
 +G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GvcMixerStream, gvc_mixer_stream, G_TYPE_OBJECT)
 +
 +static void
 +free_port (GvcMixerStreamPort *p)
 +{
 +        g_free (p->port);
 +        g_free (p->human_port);
 +        g_slice_free (GvcMixerStreamPort, p);
 +}
 +
 +static GvcMixerStreamPort *
 +dup_port (GvcMixerStreamPort *p)
 +{
 +        GvcMixerStreamPort *m;
 +
 +        m = g_slice_new (GvcMixerStreamPort);
 +
 +        *m = *p;
 +        m->port = g_strdup (p->port);
 +        m->human_port = g_strdup (p->human_port);
 +
 +        return m;
 +}
 +
 +G_DEFINE_BOXED_TYPE (GvcMixerStreamPort, gvc_mixer_stream_port, dup_port, free_port)
 +
 +static guint32
 +get_next_stream_serial (void)
 +{
 +        guint32 serial;
 +
 +        serial = stream_serial++;
 +
 +        if ((gint32)stream_serial < 0) {
 +                stream_serial = 1;
 +        }
 +
 +        return serial;
 +}
 +
 +pa_context *
 +gvc_mixer_stream_get_pa_context (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
 +        return stream->priv->pa_context;
 +}
 +
 +guint
 +gvc_mixer_stream_get_index (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
 +        return stream->priv->index;
 +}
 +
 +guint
 +gvc_mixer_stream_get_id (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
 +        return stream->priv->id;
 +}
 +
 +const GvcChannelMap *
 +gvc_mixer_stream_get_channel_map (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->channel_map;
 +}
 +
 +/**
 + * gvc_mixer_stream_get_volume:
 + * @stream:
 + *
 + * Returns: (type guint32):
 + */
 +pa_volume_t
 +gvc_mixer_stream_get_volume (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
 +
 +        return (pa_volume_t) gvc_channel_map_get_volume(stream->priv->channel_map)[VOLUME];
 +}
 +
 +gdouble
 +gvc_mixer_stream_get_decibel (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
 +
 +        return pa_sw_volume_to_dB(
 +                        (pa_volume_t) gvc_channel_map_get_volume(stream->priv->channel_map)[VOLUME]);
 +}
 +
 +/**
 + * gvc_mixer_stream_set_volume:
 + * @stream:
 + * @volume: (type guint32):
 + *
 + * Returns:
 + */
 +gboolean
 +gvc_mixer_stream_set_volume (GvcMixerStream *stream,
 +                              pa_volume_t     volume)
 +{
 +        pa_cvolume cv;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        cv = *gvc_channel_map_get_cvolume(stream->priv->channel_map);
 +        pa_cvolume_scale(&cv, volume);
 +
 +        if (!pa_cvolume_equal(gvc_channel_map_get_cvolume(stream->priv->channel_map), &cv)) {
 +                gvc_channel_map_volume_changed(stream->priv->channel_map, &cv, FALSE);
-                 g_object_notify (G_OBJECT (stream), "volume");
++                g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_VOLUME]);
 +                return TRUE;
 +        }
 +
 +        return FALSE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_decibel (GvcMixerStream *stream,
 +                              gdouble         db)
 +{
 +        pa_cvolume cv;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        cv = *gvc_channel_map_get_cvolume(stream->priv->channel_map);
 +        pa_cvolume_scale(&cv, pa_sw_volume_from_dB(db));
 +
 +        if (!pa_cvolume_equal(gvc_channel_map_get_cvolume(stream->priv->channel_map), &cv)) {
 +                gvc_channel_map_volume_changed(stream->priv->channel_map, &cv, FALSE);
-                 g_object_notify (G_OBJECT (stream), "is-muted");
++                g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_VOLUME]);
 +        }
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_get_is_muted  (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +        return stream->priv->is_muted;
 +}
 +
 +gboolean
 +gvc_mixer_stream_get_can_decibel (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +        return stream->priv->can_decibel;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_is_muted  (GvcMixerStream *stream,
 +                                gboolean        is_muted)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        if (is_muted != stream->priv->is_muted) {
 +                stream->priv->is_muted = is_muted;
-                 g_object_notify (G_OBJECT (stream), "can-decibel");
++                g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_IS_MUTED]);
 +        }
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_can_decibel  (GvcMixerStream *stream,
 +                                   gboolean        can_decibel)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        if (can_decibel != stream->priv->can_decibel) {
 +                stream->priv->can_decibel = can_decibel;
-         g_object_notify (G_OBJECT (stream), "name");
++                g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_CAN_DECIBEL]);
 +        }
 +
 +        return TRUE;
 +}
 +
 +const char *
 +gvc_mixer_stream_get_name (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->name;
 +}
 +
 +const char *
 +gvc_mixer_stream_get_description (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->description;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_name (GvcMixerStream *stream,
 +                           const char     *name)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_free (stream->priv->name);
 +        stream->priv->name = g_strdup (name);
-         g_object_notify (G_OBJECT (stream), "description");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_NAME]);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_description (GvcMixerStream *stream,
 +                                  const char     *description)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_free (stream->priv->description);
 +        stream->priv->description = g_strdup (description);
-         g_object_notify (G_OBJECT (stream), "is-event-stream");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_DESCRIPTION]);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_is_event_stream (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        return stream->priv->is_event_stream;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_is_event_stream (GvcMixerStream *stream,
 +                                      gboolean is_event_stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        stream->priv->is_event_stream = is_event_stream;
-         g_object_notify (G_OBJECT (stream), "is-virtual");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_IS_EVENT_STREAM]);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_is_virtual (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        return stream->priv->is_virtual;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_is_virtual (GvcMixerStream *stream,
 +                                 gboolean is_virtual)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        stream->priv->is_virtual = is_virtual;
-         g_object_notify (G_OBJECT (stream), "application-id");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_IS_VIRTUAL]);
 +
 +        return TRUE;
 +}
 +
 +const char *
 +gvc_mixer_stream_get_application_id (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->application_id;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_application_id (GvcMixerStream *stream,
 +                                     const char *application_id)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_free (stream->priv->application_id);
 +        stream->priv->application_id = g_strdup (application_id);
-         g_object_notify (G_OBJECT (stream), "volume");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_APPLICATION_ID]);
 +
 +        return TRUE;
 +}
 +
 +static void
 +on_channel_map_volume_changed (GvcChannelMap  *channel_map,
 +                               gboolean        set,
 +                               GvcMixerStream *stream)
 +{
 +        if (set == TRUE)
 +                gvc_mixer_stream_push_volume (stream);
 +
-                 g_object_notify (G_OBJECT (stream), "channel-map");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_VOLUME]);
 +}
 +
 +static gboolean
 +gvc_mixer_stream_set_channel_map (GvcMixerStream *stream,
 +                                  GvcChannelMap  *channel_map)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        if (channel_map != NULL) {
 +                g_object_ref (channel_map);
 +        }
 +
 +        if (stream->priv->channel_map != NULL) {
 +                g_signal_handlers_disconnect_by_func (stream->priv->channel_map,
 +                                                      on_channel_map_volume_changed,
 +                                                      stream);
 +                g_object_unref (stream->priv->channel_map);
 +        }
 +
 +        stream->priv->channel_map = channel_map;
 +
 +        if (stream->priv->channel_map != NULL) {
 +                g_signal_connect (stream->priv->channel_map,
 +                                  "volume-changed",
 +                                  G_CALLBACK (on_channel_map_volume_changed),
 +                                  stream);
 +
-         g_object_notify (G_OBJECT (stream), "icon-name");
++                g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_CHANNEL_MAP]);
 +        }
 +
 +        return TRUE;
 +}
 +
 +const char *
 +gvc_mixer_stream_get_icon_name (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->icon_name;
 +}
 +
 +const char *
 +gvc_mixer_stream_get_form_factor (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->form_factor;
 +}
 +
 +const char *
 +gvc_mixer_stream_get_sysfs_path (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->sysfs_path;
 +}
 +
 +/**
 + * gvc_mixer_stream_get_gicon:
 + * @stream: a #GvcMixerStream
 + *
 + * Returns: (transfer full): a new #GIcon
 + */
 +GIcon *
 +gvc_mixer_stream_get_gicon (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        if (stream->priv->icon_name == NULL)
 +                return NULL;
 +        return g_themed_icon_new_with_default_fallbacks (stream->priv->icon_name);
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_icon_name (GvcMixerStream *stream,
 +                                const char     *icon_name)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_free (stream->priv->icon_name);
 +        stream->priv->icon_name = g_strdup (icon_name);
-         g_object_notify (G_OBJECT (stream), "form-factor");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_ICON_NAME]);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_form_factor (GvcMixerStream *stream,
 +                                  const char     *form_factor)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_free (stream->priv->form_factor);
 +        stream->priv->form_factor = g_strdup (form_factor);
-         g_object_notify (G_OBJECT (stream), "sysfs-path");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_FORM_FACTOR]);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_sysfs_path (GvcMixerStream *stream,
 +                                 const char     *sysfs_path)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        g_free (stream->priv->sysfs_path);
 +        stream->priv->sysfs_path = g_strdup (sysfs_path);
-         g_object_notify (G_OBJECT (stream), "port");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_SYSFS_PATH]);
 +
 +        return TRUE;
 +}
 +
 +/**
 + * gvc_mixer_stream_get_base_volume:
 + * @stream:
 + *
 + * Returns: (type guint32):
 + */
 +pa_volume_t
 +gvc_mixer_stream_get_base_volume (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
 +
 +        return stream->priv->base_volume;
 +}
 +
 +/**
 + * gvc_mixer_stream_set_base_volume:
 + * @stream:
 + * @base_volume: (type guint32):
 + *
 + * Returns:
 + */
 +gboolean
 +gvc_mixer_stream_set_base_volume (GvcMixerStream *stream,
 +                                  pa_volume_t base_volume)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        stream->priv->base_volume = base_volume;
 +
 +        return TRUE;
 +}
 +
 +const GvcMixerStreamPort *
 +gvc_mixer_stream_get_port (GvcMixerStream *stream)
 +{
 +        GList *l;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        g_return_val_if_fail (stream->priv->ports != NULL, NULL);
 +
 +        for (l = stream->priv->ports; l != NULL; l = l->next) {
 +                GvcMixerStreamPort *p = l->data;
 +                if (g_strcmp0 (stream->priv->port, p->port) == 0) {
 +                        return p;
 +                }
 +        }
 +
 +        g_assert_not_reached ();
 +
 +        return NULL;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_port (GvcMixerStream *stream,
 +                           const char     *port)
 +{
 +        GList *l;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +        g_return_val_if_fail (stream->priv->ports != NULL, FALSE);
 +
 +        g_free (stream->priv->port);
 +        stream->priv->port = g_strdup (port);
 +
 +        g_free (stream->priv->human_port);
 +        stream->priv->human_port = NULL;
 +
 +        for (l = stream->priv->ports; l != NULL; l = l->next) {
 +                GvcMixerStreamPort *p = l->data;
 +                if (g_str_equal (stream->priv->port, p->port)) {
 +                        stream->priv->human_port = g_strdup (p->human_port);
 +                        break;
 +                }
 +        }
 +
-                 g_object_notify (G_OBJECT (stream), "state");
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_PORT]);
 +
 +        return TRUE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_change_port (GvcMixerStream *stream,
 +                              const char     *port)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +        return GVC_MIXER_STREAM_GET_CLASS (stream)->change_port (stream, port);
 +}
 +
 +/**
 + * gvc_mixer_stream_get_ports:
 + *
 + * Return value: (transfer none) (element-type GvcMixerStreamPort):
 + */
 +const GList *
 +gvc_mixer_stream_get_ports (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), NULL);
 +        return stream->priv->ports;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_state (GvcMixerStream      *stream,
 +                            GvcMixerStreamState  state)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        if (stream->priv->state != state) {
 +                stream->priv->state = state;
-         g_object_notify (G_OBJECT (stream), "card-index");
++                g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_STATE]);
 +        }
 +
 +        return TRUE;
 +}
 +
 +GvcMixerStreamState
 +gvc_mixer_stream_get_state (GvcMixerStream      *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), GVC_STREAM_STATE_INVALID);
 +        return stream->priv->state;
 +}
 +
 +static int
 +sort_ports (GvcMixerStreamPort *a,
 +            GvcMixerStreamPort *b)
 +{
 +        if (a->priority == b->priority)
 +                return 0;
 +        if (a->priority > b->priority)
 +                return 1;
 +        return -1;
 +}
 +
 +/**
 + * gvc_mixer_stream_set_ports:
 + * @ports: (transfer full) (element-type GvcMixerStreamPort):
 + */
 +gboolean
 +gvc_mixer_stream_set_ports (GvcMixerStream *stream,
 +                            GList          *ports)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +        g_return_val_if_fail (stream->priv->ports == NULL, FALSE);
 +
 +        stream->priv->ports = g_list_sort (ports, (GCompareFunc) sort_ports);
 +
 +        return TRUE;
 +}
 +
 +guint
 +gvc_mixer_stream_get_card_index (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), PA_INVALID_INDEX);
 +        return stream->priv->card_index;
 +}
 +
 +gboolean
 +gvc_mixer_stream_set_card_index (GvcMixerStream *stream,
 +                                 guint           card_index)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        stream->priv->card_index = card_index;
-         g_object_class_install_property (gobject_class,
-                                          PROP_INDEX,
-                                          g_param_spec_ulong ("index",
-                                                              "Index",
-                                                              "The index for this stream",
-                                                              0, G_MAXULONG, 0,
-                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-         g_object_class_install_property (gobject_class,
-                                          PROP_ID,
-                                          g_param_spec_ulong ("id",
-                                                              "id",
-                                                              "The id for this stream",
-                                                              0, G_MAXULONG, 0,
-                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-         g_object_class_install_property (gobject_class,
-                                          PROP_CHANNEL_MAP,
-                                          g_param_spec_object ("channel-map",
-                                                               "channel map",
-                                                               "The channel map for this stream",
-                                                               GVC_TYPE_CHANNEL_MAP,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_PA_CONTEXT,
-                                          g_param_spec_pointer ("pa-context",
-                                                                "PulseAudio context",
-                                                                "The PulseAudio context for this stream",
-                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-         g_object_class_install_property (gobject_class,
-                                          PROP_VOLUME,
-                                          g_param_spec_ulong ("volume",
-                                                              "Volume",
-                                                              "The volume for this stream",
-                                                              0, G_MAXULONG, 0,
-                                                              G_PARAM_READWRITE));
-         g_object_class_install_property (gobject_class,
-                                          PROP_DECIBEL,
-                                          g_param_spec_double ("decibel",
-                                                               "Decibel",
-                                                               "The decibel level for this stream",
-                                                               -G_MAXDOUBLE, G_MAXDOUBLE, 0,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
- 
-         g_object_class_install_property (gobject_class,
-                                          PROP_NAME,
-                                          g_param_spec_string ("name",
-                                                               "Name",
-                                                               "Name to display for this stream",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_DESCRIPTION,
-                                          g_param_spec_string ("description",
-                                                               "Description",
-                                                               "Description to display for this stream",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_APPLICATION_ID,
-                                          g_param_spec_string ("application-id",
++        g_object_notify_by_pspec (G_OBJECT (stream), obj_props[PROP_CARD_INDEX]);
 +
 +        return TRUE;
 +}
 +
 +static void
 +gvc_mixer_stream_set_property (GObject       *object,
 +                               guint          prop_id,
 +                               const GValue  *value,
 +                               GParamSpec    *pspec)
 +{
 +        GvcMixerStream *self = GVC_MIXER_STREAM (object);
 +
 +        switch (prop_id) {
 +        case PROP_PA_CONTEXT:
 +                self->priv->pa_context = g_value_get_pointer (value);
 +                break;
 +        case PROP_INDEX:
 +                self->priv->index = g_value_get_ulong (value);
 +                break;
 +        case PROP_ID:
 +                self->priv->id = g_value_get_ulong (value);
 +                break;
 +        case PROP_CHANNEL_MAP:
 +                gvc_mixer_stream_set_channel_map (self, g_value_get_object (value));
 +                break;
 +        case PROP_NAME:
 +                gvc_mixer_stream_set_name (self, g_value_get_string (value));
 +                break;
 +        case PROP_DESCRIPTION:
 +                gvc_mixer_stream_set_description (self, g_value_get_string (value));
 +                break;
 +        case PROP_APPLICATION_ID:
 +                gvc_mixer_stream_set_application_id (self, g_value_get_string (value));
 +                break;
 +        case PROP_ICON_NAME:
 +                gvc_mixer_stream_set_icon_name (self, g_value_get_string (value));
 +                break;
 +        case PROP_FORM_FACTOR:
 +                gvc_mixer_stream_set_form_factor (self, g_value_get_string (value));
 +                break;
 +      case PROP_SYSFS_PATH:
 +              gvc_mixer_stream_set_sysfs_path (self, g_value_get_string (value));
 +              break;
 +        case PROP_VOLUME:
 +                gvc_mixer_stream_set_volume (self, g_value_get_ulong (value));
 +                break;
 +        case PROP_DECIBEL:
 +                gvc_mixer_stream_set_decibel (self, g_value_get_double (value));
 +                break;
 +        case PROP_IS_MUTED:
 +                gvc_mixer_stream_set_is_muted (self, g_value_get_boolean (value));
 +                break;
 +        case PROP_IS_EVENT_STREAM:
 +                gvc_mixer_stream_set_is_event_stream (self, g_value_get_boolean (value));
 +                break;
 +        case PROP_IS_VIRTUAL:
 +                gvc_mixer_stream_set_is_virtual (self, g_value_get_boolean (value));
 +                break;
 +        case PROP_CAN_DECIBEL:
 +                gvc_mixer_stream_set_can_decibel (self, g_value_get_boolean (value));
 +                break;
 +        case PROP_PORT:
 +                gvc_mixer_stream_set_port (self, g_value_get_string (value));
 +                break;
 +        case PROP_STATE:
 +                gvc_mixer_stream_set_state (self, g_value_get_enum (value));
 +                break;
 +        case PROP_CARD_INDEX:
 +                self->priv->card_index = g_value_get_long (value);
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_stream_get_property (GObject     *object,
 +                               guint        prop_id,
 +                               GValue      *value,
 +                               GParamSpec  *pspec)
 +{
 +        GvcMixerStream *self = GVC_MIXER_STREAM (object);
 +
 +        switch (prop_id) {
 +        case PROP_PA_CONTEXT:
 +                g_value_set_pointer (value, self->priv->pa_context);
 +                break;
 +        case PROP_INDEX:
 +                g_value_set_ulong (value, self->priv->index);
 +                break;
 +        case PROP_ID:
 +                g_value_set_ulong (value, self->priv->id);
 +                break;
 +        case PROP_CHANNEL_MAP:
 +                g_value_set_object (value, self->priv->channel_map);
 +                break;
 +        case PROP_NAME:
 +                g_value_set_string (value, self->priv->name);
 +                break;
 +        case PROP_DESCRIPTION:
 +                g_value_set_string (value, self->priv->description);
 +                break;
 +        case PROP_APPLICATION_ID:
 +                g_value_set_string (value, self->priv->application_id);
 +                break;
 +        case PROP_ICON_NAME:
 +                g_value_set_string (value, self->priv->icon_name);
 +                break;
 +        case PROP_FORM_FACTOR:
 +                g_value_set_string (value, self->priv->form_factor);
 +                break;
 +      case PROP_SYSFS_PATH:
 +              g_value_set_string (value, self->priv->sysfs_path);
 +              break;
 +        case PROP_VOLUME:
 +                g_value_set_ulong (value,
 +                                   pa_cvolume_max(gvc_channel_map_get_cvolume(self->priv->channel_map)));
 +                break;
 +        case PROP_DECIBEL:
 +                g_value_set_double (value,
 +                                    pa_sw_volume_to_dB(pa_cvolume_max(gvc_channel_map_get_cvolume(self->priv->channel_map))));
 +                break;
 +        case PROP_IS_MUTED:
 +                g_value_set_boolean (value, self->priv->is_muted);
 +                break;
 +        case PROP_IS_EVENT_STREAM:
 +                g_value_set_boolean (value, self->priv->is_event_stream);
 +                break;
 +        case PROP_IS_VIRTUAL:
 +                g_value_set_boolean (value, self->priv->is_virtual);
 +                break;
 +        case PROP_CAN_DECIBEL:
 +                g_value_set_boolean (value, self->priv->can_decibel);
 +                break;
 +        case PROP_PORT:
 +                g_value_set_string (value, self->priv->port);
 +                break;
 +        case PROP_STATE:
 +                g_value_set_enum (value, self->priv->state);
 +                break;
 +        case PROP_CARD_INDEX:
 +                g_value_set_long (value, self->priv->card_index);
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 +                break;
 +        }
 +}
 +
 +static GObject *
 +gvc_mixer_stream_constructor (GType                  type,
 +                              guint                  n_construct_properties,
 +                              GObjectConstructParam *construct_params)
 +{
 +        GObject       *object;
 +        GvcMixerStream *self;
 +
 +        object = G_OBJECT_CLASS (gvc_mixer_stream_parent_class)->constructor (type, n_construct_properties, construct_params);
 +
 +        self = GVC_MIXER_STREAM (object);
 +
 +        self->priv->id = get_next_stream_serial ();
 +
 +        return object;
 +}
 +
 +static gboolean
 +gvc_mixer_stream_real_change_port (GvcMixerStream *stream,
 +                                   const char     *port)
 +{
 +        return FALSE;
 +}
 +
 +static gboolean
 +gvc_mixer_stream_real_push_volume (GvcMixerStream *stream, gpointer *op)
 +{
 +        return FALSE;
 +}
 +
 +static gboolean
 +gvc_mixer_stream_real_change_is_muted (GvcMixerStream *stream,
 +                                       gboolean        is_muted)
 +{
 +        return FALSE;
 +}
 +
 +gboolean
 +gvc_mixer_stream_push_volume (GvcMixerStream *stream)
 +{
 +        pa_operation *op;
 +        gboolean ret;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        if (stream->priv->is_event_stream != FALSE)
 +                return TRUE;
 +
 +        g_debug ("Pushing new volume to stream '%s' (%s)",
 +                 stream->priv->description, stream->priv->name);
 +
 +        ret = GVC_MIXER_STREAM_GET_CLASS (stream)->push_volume (stream, (gpointer *) &op);
 +        if (ret) {
 +                if (stream->priv->change_volume_op != NULL)
 +                        pa_operation_unref (stream->priv->change_volume_op);
 +                stream->priv->change_volume_op = op;
 +        }
 +        return ret;
 +}
 +
 +gboolean
 +gvc_mixer_stream_change_is_muted (GvcMixerStream *stream,
 +                                  gboolean        is_muted)
 +{
 +        gboolean ret;
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +        ret = GVC_MIXER_STREAM_GET_CLASS (stream)->change_is_muted (stream, is_muted);
 +        return ret;
 +}
 +
 +gboolean
 +gvc_mixer_stream_is_running (GvcMixerStream *stream)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
 +
 +        if (stream->priv->change_volume_op == NULL)
 +                return FALSE;
 +
 +        if ((pa_operation_get_state(stream->priv->change_volume_op) == PA_OPERATION_RUNNING))
 +                return TRUE;
 +
 +        pa_operation_unref(stream->priv->change_volume_op);
 +        stream->priv->change_volume_op = NULL;
 +
 +        return FALSE;
 +}
 +
 +static void
 +gvc_mixer_stream_class_init (GvcMixerStreamClass *klass)
 +{
 +        GObjectClass   *gobject_class = G_OBJECT_CLASS (klass);
 +
 +        gobject_class->constructor = gvc_mixer_stream_constructor;
 +        gobject_class->finalize = gvc_mixer_stream_finalize;
 +        gobject_class->set_property = gvc_mixer_stream_set_property;
 +        gobject_class->get_property = gvc_mixer_stream_get_property;
 +
 +        klass->push_volume = gvc_mixer_stream_real_push_volume;
 +        klass->change_port = gvc_mixer_stream_real_change_port;
 +        klass->change_is_muted = gvc_mixer_stream_real_change_is_muted;
 +
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_ICON_NAME,
-                                          g_param_spec_string ("icon-name",
-                                                               "Icon Name",
-                                                               "Name of icon to display for this stream",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_FORM_FACTOR,
-                                          g_param_spec_string ("form-factor",
-                                                               "Form Factor",
-                                                               "Device form factor for this stream, as reported by PulseAudio",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_SYSFS_PATH,
-                                          g_param_spec_string ("sysfs-path",
-                                                               "Sysfs path",
-                                                               "Sysfs path for the device associated with this stream",
-                                                               NULL,
-                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_IS_MUTED,
-                                          g_param_spec_boolean ("is-muted",
-                                                                "is muted",
-                                                                "Whether stream is muted",
-                                                                FALSE,
-                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_CAN_DECIBEL,
-                                          g_param_spec_boolean ("can-decibel",
-                                                                "can decibel",
-                                                                "Whether stream volume can be converted to decibel units",
-                                                                FALSE,
-                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_IS_EVENT_STREAM,
-                                          g_param_spec_boolean ("is-event-stream",
-                                                                "is event stream",
-                                                                "Whether stream's role is to play an event",
-                                                                FALSE,
-                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_IS_VIRTUAL,
-                                          g_param_spec_boolean ("is-virtual",
-                                                                "is virtual stream",
-                                                                "Whether the stream is virtual",
-                                                                FALSE,
-                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
-         g_object_class_install_property (gobject_class,
-                                          PROP_PORT,
-                                          g_param_spec_string ("port",
-                                                               "Port",
-                                                               "The name of the current port for this stream",
-                                                               NULL,
-                                                               G_PARAM_READWRITE));
-         g_object_class_install_property (gobject_class,
-                                          PROP_STATE,
-                                          g_param_spec_enum ("state",
-                                                             "State",
-                                                             "The current state of this stream",
-                                                             GVC_TYPE_MIXER_STREAM_STATE,
-                                                             GVC_STREAM_STATE_INVALID,
-                                                             G_PARAM_READWRITE));
-         g_object_class_install_property (gobject_class,
-                                          PROP_CARD_INDEX,
-                                          g_param_spec_long ("card-index",
-                                                              "Card index",
-                                                              "The index of the card for this stream",
-                                                              PA_INVALID_INDEX, G_MAXLONG, PA_INVALID_INDEX,
-                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
++        obj_props[PROP_INDEX] = g_param_spec_ulong ("index",
++                                                    "Index",
++                                                    "The index for this stream",
++                                                    0, G_MAXULONG, 0,
++                                                    G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_ID] = g_param_spec_ulong ("id",
++                                                 "id",
++                                                 "The id for this stream",
++                                                 0, G_MAXULONG, 0,
++                                                 G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_CHANNEL_MAP] = g_param_spec_object ("channel-map",
++                                                           "channel map",
++                                                           "The channel map for this stream",
++                                                           GVC_TYPE_CHANNEL_MAP,
++                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_PA_CONTEXT] = g_param_spec_pointer ("pa-context",
++                                                           "PulseAudio context",
++                                                           "The PulseAudio context for this stream",
++                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_VOLUME] = g_param_spec_ulong ("volume",
++                                                     "Volume",
++                                                     "The volume for this stream",
++                                                     0, G_MAXULONG, 0,
++                                                     G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_DECIBEL] = g_param_spec_double ("decibel",
++                                                       "Decibel",
++                                                       "The decibel level for this stream",
++                                                       -G_MAXDOUBLE, G_MAXDOUBLE, 0,
++                                                       G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_NAME] = g_param_spec_string ("name",
++                                                    "Name",
++                                                    "Name to display for this stream",
++                                                    NULL,
++                                                    G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_DESCRIPTION] = g_param_spec_string ("description",
++                                                           "Description",
++                                                           "Description to display for this stream",
++                                                           NULL,
++                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_APPLICATION_ID] = g_param_spec_string ("application-id",
 +                                                              "Application identifier",
 +                                                              "Application identifier for this stream",
 +                                                              NULL,
++                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_ICON_NAME] = g_param_spec_string ("icon-name",
++                                                         "Icon Name",
++                                                         "Name of icon to display for this stream",
++                                                         NULL,
++                                                         G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_FORM_FACTOR] = g_param_spec_string ("form-factor",
++                                                           "Form Factor",
++                                                           "Device form factor for this stream, as reported by PulseAudio",
++                                                           NULL,
++                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_SYSFS_PATH] = g_param_spec_string ("sysfs-path",
++                                                          "Sysfs path",
++                                                          "Sysfs path for the device associated with this stream",
++                                                          NULL,
++                                                          G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_IS_MUTED] = g_param_spec_boolean ("is-muted",
++                                                         "is muted",
++                                                         "Whether stream is muted",
++                                                         FALSE,
++                                                         G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_CAN_DECIBEL] = g_param_spec_boolean ("can-decibel",
++                                                            "can decibel",
++                                                            "Whether stream volume can be converted to decibel units",
++                                                            FALSE,
++                                                            G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_IS_EVENT_STREAM] = g_param_spec_boolean ("is-event-stream",
++                                                                "is event stream",
++                                                                "Whether stream's role is to play an event",
++                                                                FALSE,
++                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_IS_VIRTUAL] = g_param_spec_boolean ("is-virtual",
++                                                           "is virtual stream",
++                                                           "Whether the stream is virtual",
++                                                           FALSE,
++                                                           G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_PORT] = g_param_spec_string ("port",
++                                                    "Port",
++                                                    "The name of the current port for this stream",
++                                                    NULL,
++                                                    G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_STATE] = g_param_spec_enum ("state",
++                                                   "State",
++                                                   "The current state of this stream",
++                                                   GVC_TYPE_MIXER_STREAM_STATE,
++                                                   GVC_STREAM_STATE_INVALID,
++                                                   G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
++        obj_props[PROP_CARD_INDEX] = g_param_spec_long ("card-index",
++                                                        "Card index",
++                                                        "The index of the card for this stream",
++                                                        PA_INVALID_INDEX, G_MAXLONG, PA_INVALID_INDEX,
++                                                        G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++
++        g_object_class_install_properties (gobject_class, N_PROPS, obj_props);
 +}
 +
 +static void
 +gvc_mixer_stream_init (GvcMixerStream *stream)
 +{
 +        stream->priv = gvc_mixer_stream_get_instance_private (stream);
 +}
 +
 +static void
 +gvc_mixer_stream_finalize (GObject *object)
 +{
 +        GvcMixerStream *mixer_stream;
 +
 +        g_return_if_fail (object != NULL);
 +        g_return_if_fail (GVC_IS_MIXER_STREAM (object));
 +
 +        mixer_stream = GVC_MIXER_STREAM (object);
 +
 +        g_return_if_fail (mixer_stream->priv != NULL);
 +
 +        g_object_unref (mixer_stream->priv->channel_map);
 +        mixer_stream->priv->channel_map = NULL;
 +
 +        g_free (mixer_stream->priv->name);
 +        mixer_stream->priv->name = NULL;
 +
 +        g_free (mixer_stream->priv->description);
 +        mixer_stream->priv->description = NULL;
 +
 +        g_free (mixer_stream->priv->application_id);
 +        mixer_stream->priv->application_id = NULL;
 +
 +        g_free (mixer_stream->priv->icon_name);
 +        mixer_stream->priv->icon_name = NULL;
 +
 +        g_free (mixer_stream->priv->form_factor);
 +        mixer_stream->priv->form_factor = NULL;
 +
 +        g_free (mixer_stream->priv->sysfs_path);
 +        mixer_stream->priv->sysfs_path = NULL;
 +
 +        g_free (mixer_stream->priv->port);
 +        mixer_stream->priv->port = NULL;
 +
 +        g_free (mixer_stream->priv->human_port);
 +        mixer_stream->priv->human_port = NULL;
 +
 +        g_list_free_full (mixer_stream->priv->ports, (GDestroyNotify) free_port);
 +        mixer_stream->priv->ports = NULL;
 +
 +       if (mixer_stream->priv->change_volume_op) {
 +               pa_operation_unref(mixer_stream->priv->change_volume_op);
 +               mixer_stream->priv->change_volume_op = NULL;
 +       }
 +
 +        G_OBJECT_CLASS (gvc_mixer_stream_parent_class)->finalize (object);
 +}
index f7dd33ec1383f278faf0c0d55e19ec6634d08196,0000000000000000000000000000000000000000..db1a694bbd96b3c963248b2cfef372a6eb57f9bf
mode 100644,000000..100644
--- /dev/null
@@@ -1,741 -1,0 +1,744 @@@
-         GParamSpec *pspec;
 +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
 +/*
 + * gvc-mixer-ui-device.c
 + * Copyright (C) Conor Curran 2011 <conor.curran@canonical.com>
 + * Copyright (C) 2012 David Henningsson, Canonical Ltd. <david.henningsson@canonical.com>
 + *
 + * gvc-mixer-ui-device.c is free software: you can redistribute it and/or modify it
 + * under the terms of the GNU General Public License as published by the
 + * Free Software Foundation, either version 2 of the License, or
 + * (at your option) any later version.
 + *
 + * gvc-mixer-ui-device.c is distributed in the hope that it will be useful, but
 + * WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 + * See the GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License along
 + * with this program.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +#include <string.h>
 +
 +#include "gvc-mixer-ui-device.h"
 +#include "gvc-mixer-card.h"
 +
 +struct GvcMixerUIDevicePrivate
 +{
 +        gchar                      *first_line_desc;
 +        gchar                      *second_line_desc;
 +
 +        GvcMixerCard               *card;
 +        gchar                      *port_name;
 +        char                       *icon_name; 
 +        guint                       stream_id;
 +        guint                       id;
 +        gboolean                    port_available;
 +
 +        /* These two lists contain pointers to GvcMixerCardProfile objects. Those objects are owned by GvcMixerCard. *
 +         * TODO: Do we want to add a weak reference to the GvcMixerCard for this reason? */
 +        GList                      *supported_profiles; /* all profiles supported by this port.*/
 +        GList                      *profiles; /* profiles to be added to combobox, subset of supported_profiles. */
 +        GvcMixerUIDeviceDirection   type;
 +        gboolean                    disable_profile_swapping;
 +        gchar                      *user_preferred_profile;
 +};
 +
 +enum
 +{
 +        PROP_0,
 +        PROP_DESC_LINE_1,
 +        PROP_DESC_LINE_2,
 +        PROP_CARD,
 +        PROP_PORT_NAME,
 +        PROP_STREAM_ID,
 +        PROP_UI_DEVICE_TYPE,
 +        PROP_PORT_AVAILABLE,
 +        PROP_ICON_NAME,
++        N_PROPS
 +};
++static GParamSpec *obj_props[N_PROPS] = { NULL, };
 +
 +static void     gvc_mixer_ui_device_finalize   (GObject               *object);
 +
 +static void     gvc_mixer_ui_device_set_icon_name (GvcMixerUIDevice *device,
 +                                                   const char       *icon_name);
 +
 +G_DEFINE_TYPE_WITH_PRIVATE (GvcMixerUIDevice, gvc_mixer_ui_device, G_TYPE_OBJECT)
 +
 +static guint32
 +get_next_output_serial (void)
 +{
 +        static guint32 output_serial = 1;
 +        guint32 serial;
 +
 +        serial = output_serial++;
 +
 +        if ((gint32)output_serial < 0)
 +                output_serial = 1;
 +
 +        return serial;
 +}
 +
 +static void
 +gvc_mixer_ui_device_get_property  (GObject       *object,
 +                                   guint         property_id,
 +                                   GValue        *value,
 +                                   GParamSpec    *pspec)
 +{
 +        GvcMixerUIDevice *self = GVC_MIXER_UI_DEVICE (object);
 +
 +        switch (property_id) {
 +        case PROP_DESC_LINE_1:
 +                g_value_set_string (value, self->priv->first_line_desc);
 +                break;
 +        case PROP_DESC_LINE_2:
 +                g_value_set_string (value, self->priv->second_line_desc);
 +                break;
 +        case PROP_CARD:
 +                g_value_set_pointer (value, self->priv->card);
 +                break;
 +        case PROP_PORT_NAME:
 +                g_value_set_string (value, self->priv->port_name);
 +                break;
 +        case PROP_STREAM_ID:
 +                g_value_set_uint (value, self->priv->stream_id);
 +                break;
 +        case PROP_UI_DEVICE_TYPE:
 +                g_value_set_uint (value, (guint)self->priv->type);
 +                break;
 +        case PROP_PORT_AVAILABLE:
 +                g_value_set_boolean (value, self->priv->port_available);
 +                break;
 +        case PROP_ICON_NAME:
 +                g_value_set_string (value, gvc_mixer_ui_device_get_icon_name (self));
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 +                break;
 +        }
 +}
 +
 +static void
 +gvc_mixer_ui_device_set_property  (GObject      *object,
 +                                   guint         property_id,
 +                                   const GValue *value,
 +                                   GParamSpec   *pspec)
 +{
 +        GvcMixerUIDevice *self = GVC_MIXER_UI_DEVICE (object);
 +
 +        switch (property_id) {
 +        case PROP_DESC_LINE_1:
 +                g_free (self->priv->first_line_desc);
 +                self->priv->first_line_desc = g_value_dup_string (value);
 +                g_debug ("gvc-mixer-output-set-property - 1st line: %s",
 +                         self->priv->first_line_desc);
 +                break;
 +        case PROP_DESC_LINE_2:
 +                g_free (self->priv->second_line_desc);
 +                self->priv->second_line_desc = g_value_dup_string (value);
 +                g_debug ("gvc-mixer-output-set-property - 2nd line: %s",
 +                         self->priv->second_line_desc);
 +                break;
 +        case PROP_CARD:
 +                self->priv->card = g_value_get_pointer (value);
 +                g_debug ("gvc-mixer-output-set-property - card: %p",
 +                         self->priv->card);
 +                break;
 +        case PROP_PORT_NAME:
 +                g_free (self->priv->port_name);
 +                self->priv->port_name = g_value_dup_string (value);
 +                g_debug ("gvc-mixer-output-set-property - card port name: %s",
 +                         self->priv->port_name);
 +                break;
 +        case PROP_STREAM_ID:
 +                self->priv->stream_id = g_value_get_uint (value);
 +                g_debug ("gvc-mixer-output-set-property - sink/source id: %i",
 +                         self->priv->stream_id);
 +                break;
 +        case PROP_UI_DEVICE_TYPE:
 +                self->priv->type = (GvcMixerUIDeviceDirection) g_value_get_uint (value);
 +                break;
 +        case PROP_PORT_AVAILABLE:
 +                self->priv->port_available = g_value_get_boolean (value);
 +                g_debug ("gvc-mixer-output-set-property - port available %i, value passed in %i",
 +                         self->priv->port_available, g_value_get_boolean (value));
 +                break;
 +        case PROP_ICON_NAME:
 +                gvc_mixer_ui_device_set_icon_name (self, g_value_get_string (value));
 +                break;
 +        default:
 +                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 +                break;
 +        }
 +}
 +
 +static GObject *
 +gvc_mixer_ui_device_constructor (GType                  type,
 +                                 guint                  n_construct_properties,
 +                                 GObjectConstructParam *construct_params)
 +{
 +        GObject           *object;
 +        GvcMixerUIDevice  *self;
 +
 +        object = G_OBJECT_CLASS (gvc_mixer_ui_device_parent_class)->constructor (type, n_construct_properties, construct_params);
 +
 +        self = GVC_MIXER_UI_DEVICE (object);
 +        self->priv->id = get_next_output_serial ();
 +        self->priv->stream_id = GVC_MIXER_UI_DEVICE_INVALID;
 +        return object;
 +}
 +
 +static void
 +gvc_mixer_ui_device_init (GvcMixerUIDevice *device)
 +{
 +        device->priv = gvc_mixer_ui_device_get_instance_private (device);
 +}
 +
 +static void
 +gvc_mixer_ui_device_dispose (GObject *object)
 +{
 +        GvcMixerUIDevice *device;
 +
 +        g_return_if_fail (object != NULL);
 +        g_return_if_fail (GVC_MIXER_UI_DEVICE (object));
 +
 +        device = GVC_MIXER_UI_DEVICE (object);
 +
 +        g_clear_pointer (&device->priv->port_name, g_free);
 +        g_clear_pointer (&device->priv->icon_name, g_free);
 +        g_clear_pointer (&device->priv->first_line_desc, g_free);
 +        g_clear_pointer (&device->priv->second_line_desc, g_free);
 +        g_clear_pointer (&device->priv->profiles, g_list_free);
 +        g_clear_pointer (&device->priv->supported_profiles, g_list_free);
 +        g_clear_pointer (&device->priv->user_preferred_profile, g_free);
 +
 +        G_OBJECT_CLASS (gvc_mixer_ui_device_parent_class)->dispose (object);
 +}
 +
 +static void
 +gvc_mixer_ui_device_finalize (GObject *object)
 +{
 +        G_OBJECT_CLASS (gvc_mixer_ui_device_parent_class)->finalize (object);
 +}
 +
 +static void
 +gvc_mixer_ui_device_class_init (GvcMixerUIDeviceClass *klass)
 +{
 +        GObjectClass* object_class = G_OBJECT_CLASS (klass);
-         pspec = g_param_spec_string ("description",
 +
 +        object_class->constructor = gvc_mixer_ui_device_constructor;
 +        object_class->dispose = gvc_mixer_ui_device_dispose;
 +        object_class->finalize = gvc_mixer_ui_device_finalize;
 +        object_class->set_property = gvc_mixer_ui_device_set_property;
 +        object_class->get_property = gvc_mixer_ui_device_get_property;
 +
-                                      G_PARAM_READWRITE);
-         g_object_class_install_property (object_class, PROP_DESC_LINE_1, pspec);
++        obj_props[PROP_DESC_LINE_1] =
++                g_param_spec_string ("description",
 +                                     "Description construct prop",
 +                                     "Set first line description",
 +                                     "no-name-set",
-         pspec = g_param_spec_string ("origin",
++                                     G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                      G_PARAM_READWRITE);
-         g_object_class_install_property (object_class, PROP_DESC_LINE_2, pspec);
++        obj_props[PROP_DESC_LINE_2] =
++                g_param_spec_string ("origin",
 +                                     "origin construct prop",
 +                                     "Set second line description name",
 +                                     "no-name-set",
-         pspec = g_param_spec_pointer ("card",
++                                     G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                       G_PARAM_READWRITE);
++        obj_props[PROP_CARD] =
++                g_param_spec_pointer ("card",
 +                                      "Card from pulse",
 +                                      "Set/Get card",
-         g_object_class_install_property (object_class, PROP_CARD, pspec);
- 
-         pspec = g_param_spec_string ("port-name",
++                                      G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                      G_PARAM_READWRITE);
-         g_object_class_install_property (object_class, PROP_PORT_NAME, pspec);
++        obj_props[PROP_PORT_NAME] =
++                g_param_spec_string ("port-name",
 +                                     "port-name construct prop",
 +                                     "Set port-name",
 +                                     NULL,
-         pspec = g_param_spec_uint ("stream-id",
++                                     G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                    G_PARAM_READWRITE);
-         g_object_class_install_property (object_class, PROP_STREAM_ID, pspec);
++        obj_props[PROP_STREAM_ID] =
++                g_param_spec_uint ("stream-id",
 +                                   "stream id assigned by gvc-stream",
 +                                   "Set/Get stream id",
 +                                   0,
 +                                   G_MAXUINT,
 +                                   GVC_MIXER_UI_DEVICE_INVALID,
-         pspec = g_param_spec_uint ("type",
++                                   G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                    0, 1, 0, G_PARAM_READWRITE);
-         g_object_class_install_property (object_class, PROP_UI_DEVICE_TYPE, pspec);
++        obj_props[PROP_UI_DEVICE_TYPE] =
++                g_param_spec_uint ("type",
 +                                   "ui-device type",
 +                                   "determine whether its an input and output",
-         pspec = g_param_spec_boolean ("port-available",
++                                   0, 1, 0,
++                                   G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                       G_PARAM_READWRITE);
-         g_object_class_install_property (object_class, PROP_PORT_AVAILABLE, pspec);
++        obj_props[PROP_PORT_AVAILABLE] =
++                g_param_spec_boolean ("port-available",
 +                                      "available",
 +                                      "determine whether this port is available",
 +                                      FALSE,
-         pspec = g_param_spec_string ("icon-name",
++                                      G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS);
 +
-                                      G_PARAM_READWRITE|G_PARAM_CONSTRUCT);
-         g_object_class_install_property (object_class, PROP_ICON_NAME, pspec);
++        obj_props[PROP_ICON_NAME] =
++                g_param_spec_string ("icon-name",
 +                                     "Icon Name",
 +                                     "Name of icon to display for this card",
 +                                     NULL,
-         g_object_notify (G_OBJECT (device), "icon-name");
++                                     G_PARAM_READWRITE|G_PARAM_CONSTRUCT|G_PARAM_STATIC_STRINGS);
++
++        g_object_class_install_properties (object_class, N_PROPS, obj_props);
 +}
 +
 +/* Removes the part of the string that starts with skip_prefix
 + * ie. corresponding to the other direction.
 + * Normally either "input:" or "output:"
 + *
 + * Example: if given the input string "output:hdmi-stereo+input:analog-stereo" and
 + * skip_prefix "input:", the resulting string is "output:hdmi-stereo".
 + *
 + * The returned string must be freed with g_free().
 + */
 +static gchar *
 +get_profile_canonical_name (const gchar *profile_name, const gchar *skip_prefix)
 +{
 +        gchar *result = NULL;
 +        gchar **s;
 +        guint i;
 +
 +        /* optimisation for the simple case. */
 +        if (strstr (profile_name, skip_prefix) == NULL)
 +                return g_strdup (profile_name);
 +
 +        s = g_strsplit (profile_name, "+", 0);
 +        for (i = 0; i < g_strv_length (s); i++) {
 +                if (g_str_has_prefix (s[i], skip_prefix))
 +                        continue;
 +                if (result == NULL)
 +                        result = g_strdup (s[i]);
 +                else {
 +                        gchar *c = g_strdup_printf("%s+%s", result, s[i]);
 +                        g_free(result);
 +                        result = c;
 +                }
 +        }
 +
 +        g_strfreev(s);
 +
 +        if (!result)
 +                return g_strdup("off");
 +
 +        return result;
 +}
 +
 +const gchar *
 +gvc_mixer_ui_device_get_matching_profile (GvcMixerUIDevice *device, const gchar *profile)
 +{
 +        const gchar *skip_prefix = device->priv->type == UIDeviceInput ? "output:" : "input:";
 +        gchar *target_cname = get_profile_canonical_name (profile, skip_prefix);
 +        GList *l;
 +        gchar *result = NULL;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +        g_return_val_if_fail (profile != NULL, NULL);
 +
 +        for (l = device->priv->profiles; l != NULL; l = l->next) {
 +                gchar *canonical_name;
 +                GvcMixerCardProfile* p = l->data;
 +                canonical_name = get_profile_canonical_name (p->profile, skip_prefix);
 +                if (strcmp (canonical_name, target_cname) == 0)
 +                        result = p->profile;
 +                g_free (canonical_name);
 +        }
 +
 +        g_free (target_cname);
 +        g_debug ("Matching profile for '%s' is '%s'", profile, result ? result : "(null)");
 +        return result;
 +}
 +
 +
 +static void
 +add_canonical_names_of_profiles (GvcMixerUIDevice *device,
 +                                 const GList      *in_profiles,
 +                                 GHashTable       *added_profiles,
 +                                 const gchar      *skip_prefix,
 +                                 gboolean          only_canonical)
 +{
 +        const GList *l;
 +
 +        for (l = in_profiles; l != NULL; l = l->next) {
 +                gchar *canonical_name;
 +                GvcMixerCardProfile* p = l->data;
 +
 +                canonical_name = get_profile_canonical_name (p->profile, skip_prefix);
 +                g_debug ("The canonical name for '%s' is '%s'", p->profile, canonical_name);
 +
 +                /* Have we already added the canonical version of this profile? */
 +                if (g_hash_table_contains (added_profiles, canonical_name)) {
 +                        g_free (canonical_name);
 +                        continue;
 +                }
 +
 +                if (only_canonical && strcmp (p->profile, canonical_name) != 0) {
 +                        g_free (canonical_name);
 +                        continue;
 +                }
 +
 +                g_free (canonical_name);
 +
 +                /* https://bugzilla.gnome.org/show_bug.cgi?id=693654
 +                 * Don't add a profile that will make the UI device completely disappear */
 +                if (p->n_sinks == 0 && p->n_sources == 0)
 +                        continue;
 +
 +                g_debug ("Adding profile to combobox: '%s' - '%s'", p->profile, p->human_profile);
 +                g_hash_table_insert (added_profiles, g_strdup (p->profile), p);
 +                device->priv->profiles = g_list_append (device->priv->profiles, p);
 +        }
 +}
 +
 +/**
 + * gvc_mixer_ui_device_set_profiles:
 + * @in_profiles: (element-type Gvc.MixerCardProfile): a list of GvcMixerCardProfile
 + *
 + * Assigns value to
 + *  - device->priv->profiles (profiles to be added to combobox)
 + *  - device->priv->supported_profiles (all profiles of this port)
 + *  - device->priv->disable_profile_swapping (whether to show the combobox)
 + *
 + * This method attempts to reduce the list of profiles visible to the user by figuring out
 + * from the context of that device (whether it's an input or an output) what profiles
 + * actually provide an alternative.
 + *
 + * It does this by the following.
 + *  - It ignores off profiles.
 + *  - It takes the canonical name of the profile. That name is what you get when you
 + *    ignore the other direction.
 + *  - In the first iteration, it only adds the names of canonical profiles - i e
 + *    when the other side is turned off.
 + *  - Normally the first iteration covers all cases, but sometimes (e g bluetooth)
 + *    it doesn't, so add other profiles whose canonical name isn't already added
 + *    in a second iteration.
 + */
 +void
 +gvc_mixer_ui_device_set_profiles (GvcMixerUIDevice *device,
 +                                  const GList      *in_profiles)
 +{
 +        GHashTable *added_profiles;
 +        const gchar *skip_prefix = device->priv->type == UIDeviceInput ? "output:" : "input:";
 +
 +        g_return_if_fail (GVC_IS_MIXER_UI_DEVICE (device));
 +
 +        g_debug ("Set profiles for '%s'", gvc_mixer_ui_device_get_description(device));
 +
 +        if (in_profiles == NULL)
 +                return;
 +
 +        device->priv->supported_profiles = g_list_copy ((GList*) in_profiles);
 +
 +        added_profiles = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 +
 +        /* Run two iterations: First, add profiles which are canonical themselves,
 +         * Second, add profiles for which the canonical name is not added already. */
 +
 +        add_canonical_names_of_profiles(device, in_profiles, added_profiles, skip_prefix, TRUE);
 +        add_canonical_names_of_profiles(device, in_profiles, added_profiles, skip_prefix, FALSE);
 +
 +        /* TODO: Consider adding the "Off" profile here */
 +
 +        device->priv->disable_profile_swapping = g_hash_table_size (added_profiles) <= 1;
 +        g_hash_table_destroy (added_profiles);
 +}
 +
 +/**
 + * gvc_mixer_ui_device_get_best_profile:
 + * @selected: (allow-none): The selected profile or its canonical name or %NULL for any profile
 + * @current: The currently selected profile
 + *
 + * Returns: (transfer none): a profile name, valid as long as the UI device profiles are.
 + */
 +const gchar *
 +gvc_mixer_ui_device_get_best_profile (GvcMixerUIDevice *device,
 +                                      const gchar      *selected,
 +                                      const gchar      *current)
 +{
 +        GList *candidates, *l;
 +        const gchar *result;
 +        const gchar *skip_prefix;
 +        gchar *canonical_name_selected;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +        g_return_val_if_fail (current != NULL, NULL);
 +
 +        if (device->priv->type == UIDeviceInput)
 +                skip_prefix = "output:";
 +        else
 +                skip_prefix = "input:";
 +
 +        /* First make a list of profiles acceptable to switch to */
 +        canonical_name_selected = NULL;
 +        if (selected)
 +                canonical_name_selected = get_profile_canonical_name (selected, skip_prefix);
 +
 +      candidates = NULL;
 +        for (l = device->priv->supported_profiles; l != NULL; l = l->next) {
 +                gchar *canonical_name;
 +                GvcMixerCardProfile* p = l->data;
 +                canonical_name = get_profile_canonical_name (p->profile, skip_prefix);
 +                if (!canonical_name_selected || strcmp (canonical_name, canonical_name_selected) == 0) {
 +                        candidates = g_list_append (candidates, p);
 +                        g_debug ("Candidate for profile switching: '%s'", p->profile);
 +                }
 +                g_free (canonical_name);
 +        }
 +
 +        if (!candidates) {
 +                g_warning ("No suitable profile candidates for '%s'", selected ? selected : "(null)");
 +                g_free (canonical_name_selected);
 +                return current;
 +        }
 +
 +        /* 1) Maybe we can skip profile switching altogether? */
 +        result = NULL;
 +        for (l = candidates; (result == NULL) && (l != NULL); l = l->next) {
 +                GvcMixerCardProfile* p = l->data;
 +                if (strcmp (current, p->profile) == 0)
 +                        result = p->profile;
 +        }
 +
 +        /* 2) Try to keep the other side unchanged if possible */
 +        if (result == NULL) {
 +                guint prio = 0;
 +                const gchar *skip_prefix_reverse = device->priv->type == UIDeviceInput ? "input:" : "output:";
 +                gchar *current_reverse = get_profile_canonical_name (current, skip_prefix_reverse);
 +                for (l = candidates; l != NULL; l = l->next) {
 +                        gchar *p_reverse;
 +                        GvcMixerCardProfile* p = l->data;
 +                        p_reverse = get_profile_canonical_name (p->profile, skip_prefix_reverse);
 +                        g_debug ("Comparing '%s' (from '%s') with '%s', prio %d", p_reverse, p->profile, current_reverse, p->priority); 
 +                        if (strcmp (p_reverse, current_reverse) == 0 && (!result || p->priority > prio)) {
 +                                result = p->profile;
 +                                prio = p->priority;
 +                        }
 +                        g_free (p_reverse);
 +                }
 +                g_free (current_reverse);
 +        }
 +
 +        /* 3) All right, let's just pick the profile with highest priority.
 +         * TODO: We could consider asking a GUI question if this stops streams
 +         * in the other direction */
 +        if (result == NULL) {
 +                guint prio = 0;
 +                for (l = candidates; l != NULL; l = l->next) {
 +                        GvcMixerCardProfile* p = l->data;
 +                        if ((p->priority > prio) || !result) {
 +                                result = p->profile;
 +                                prio = p->priority;
 +                        }
 +                }
 +        }
 +
 +        g_list_free (candidates);
 +        g_free (canonical_name_selected);
 +        return result;
 +}
 +
 +const gchar *
 +gvc_mixer_ui_device_get_active_profile (GvcMixerUIDevice* device)
 +{
 +        GvcMixerCardProfile *profile;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        if (device->priv->card == NULL) {
 +                g_warning ("Device did not have an appropriate card");
 +                return NULL;
 +        }
 +
 +        profile = gvc_mixer_card_get_profile (device->priv->card);
 +        return gvc_mixer_ui_device_get_matching_profile (device, profile->profile);
 +}
 +
 +gboolean
 +gvc_mixer_ui_device_should_profiles_be_hidden (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), FALSE);
 +
 +        return device->priv->disable_profile_swapping;
 +}
 +
 +/**
 + * gvc_mixer_ui_device_get_profiles:
 + * @device:
 + *
 + * Returns: (transfer none) (element-type Gvc.MixerCardProfile):
 + */
 +GList*
 +gvc_mixer_ui_device_get_profiles (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        return device->priv->profiles;
 +}
 +
 +/**
 + * gvc_mixer_ui_device_get_supported_profiles:
 + * @device:
 + *
 + * Returns: (transfer none) (element-type Gvc.MixerCardProfile):
 + */
 +GList*
 +gvc_mixer_ui_device_get_supported_profiles (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        return device->priv->supported_profiles;
 +}
 +
 +guint
 +gvc_mixer_ui_device_get_id (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), 0);
 +
 +        return device->priv->id;
 +}
 +
 +guint
 +gvc_mixer_ui_device_get_stream_id (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), 0);
 +
 +        return device->priv->stream_id;
 +}
 +
 +void
 +gvc_mixer_ui_device_invalidate_stream (GvcMixerUIDevice *self)
 +{
 +        g_return_if_fail (GVC_IS_MIXER_UI_DEVICE (self));
 +
 +        self->priv->stream_id = GVC_MIXER_UI_DEVICE_INVALID;
 +}
 +
 +const gchar *
 +gvc_mixer_ui_device_get_description (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        return device->priv->first_line_desc;
 +}
 +
 +const char *
 +gvc_mixer_ui_device_get_icon_name (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        if (device->priv->icon_name)
 +                return device->priv->icon_name;
 +
 +        if (device->priv->card)
 +                return gvc_mixer_card_get_icon_name (device->priv->card);
 +
 +        return NULL;
 +}
 +
 +static void
 +gvc_mixer_ui_device_set_icon_name (GvcMixerUIDevice *device,
 +                                   const char       *icon_name)
 +{
 +        g_return_if_fail (GVC_IS_MIXER_UI_DEVICE (device));
 +
 +        g_free (device->priv->icon_name);
 +        device->priv->icon_name = g_strdup (icon_name);
++        g_object_notify_by_pspec (G_OBJECT (device), obj_props[PROP_ICON_NAME]);
 +}
 +
 +
 +/**
 + * gvc_mixer_ui_device_get_gicon:
 + * @device:
 + *
 + * Returns: (transfer full):
 + */
 +GIcon *
 +gvc_mixer_ui_device_get_gicon (GvcMixerUIDevice *device)
 +{
 +        const char *icon_name;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        icon_name = gvc_mixer_ui_device_get_icon_name (device);
 +
 +        if (icon_name != NULL)
 +                return g_themed_icon_new_with_default_fallbacks (icon_name);
 +        else
 +                return NULL;
 +}
 +
 +const gchar *
 +gvc_mixer_ui_device_get_origin (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        return device->priv->second_line_desc;
 +}
 +
 +const gchar*
 +gvc_mixer_ui_device_get_user_preferred_profile (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        return device->priv->user_preferred_profile;
 +}
 +
 +const gchar *
 +gvc_mixer_ui_device_get_top_priority_profile (GvcMixerUIDevice *device)
 +{
 +        GList *last;
 +        GvcMixerCardProfile *profile;
 +
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        last = g_list_last (device->priv->supported_profiles);
 +        profile = last->data;
 +
 +        return profile->profile;
 +}
 +
 +void
 +gvc_mixer_ui_device_set_user_preferred_profile (GvcMixerUIDevice *device,
 +                                                const gchar      *profile)
 +{
 +        g_return_if_fail (GVC_IS_MIXER_UI_DEVICE (device));
 +        g_return_if_fail (profile != NULL);
 +
 +        g_free (device->priv->user_preferred_profile);
 +        device->priv->user_preferred_profile = g_strdup (profile);
 +}
 +
 +const gchar *
 +gvc_mixer_ui_device_get_port (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), NULL);
 +
 +        return device->priv->port_name;
 +}
 +
 +gboolean
 +gvc_mixer_ui_device_has_ports (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), FALSE);
 +
 +        return (device->priv->port_name != NULL);
 +}
 +
 +gboolean
 +gvc_mixer_ui_device_is_output (GvcMixerUIDevice *device)
 +{
 +        g_return_val_if_fail (GVC_IS_MIXER_UI_DEVICE (device), FALSE);
 +
 +        return (device->priv->type == UIDeviceOutput);
 +}